2

我试图使用 Boost.Tokenizer 库。在我的PROG.cpp中,我有以下内容:

#include <boost/tokenizer.hpp>

Makefile最初是这样的

CXX = g++-4.8
CXXFLAGS = ## some irrelevant flags
LDFLAGS = ## some irrelevant flags
SOURCES = PROG.cpp
OBJECTS = $(SOURCES:.cpp=.o)
TARGETS = PROG

$(TARGETS) : $(OBJECTS)
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

## other targets

它不会编译,因为boost/tokenizer.hpp找不到:

fatal error: boost/tokenizer.hpp: No such file or directory

然后我手动将 boost 包含路径添加到CXXFLAGS

-I/opt/local/include/

(这是来自 MacPorts 的路径。)

然后我尝试包含 Tokenizer 库,但在/opt/local/lib/我有libboost_atomic-mt.dylib,libboost_chrono-mt.dylib等,但没有像tokenizer. 我当时比较迷茫。我想这仍然行不通,因为图书馆没有链接。令人惊讶的是,该程序完美地构建、链接和运行。

所以我现在真的很困惑。这里有一些问题:

(1) 我没有明确链接到 boost,所以链接器将 boost 视为标准库?

(2) 如果 boost 被视为标准,为什么标题不是标准的?

(3) 为什么有libboost_atomic-mt.dylib,libboost_chrono-mt.dylib等而没有tokenizer? tokenizer属于哪个动态库?

我对g++链接机制不是很熟悉;说到 boost,这是我第一个使用 boost 的程序。所以我真的很感激详细的解释。提前致谢!

作为参考,这是我提取的内容gcc -print-search-dirs

install: /usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/
programs: =/usr/gcc-4.8.0/libexec/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/libexec/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/libexec/gcc/x86_64-apple-darwin12.3.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/bin/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/bin/
libraries: =/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/lib/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/lib/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../:/lib/x86_64-apple-darwin12.3.0/4.8.0/:/lib/:/usr/lib/x86_64-apple-darwin12.3.0/4.8.0/:/usr/lib/
4

1 回答 1

7

大多数 boost 库只是头文件,如果您查看 .hpp 文件,您将不会只看到类的声明,就像您在头文件中所期望的那样,实际上是整个实现。这就是为什么对于 90% 的 boost 库,您无需担心链接,只需担心包含。

然而,对于一些库、序列化程序和其他一些库来说,对于标头包含方法来说,污染代码太多了,这是合理的。我确信对于何时将实现包含在标头中以及何时不包含,有一个更好、更严格的定义。

http://www.boost.org/boost-build2/doc/html/bbv2/faq/header-only-libraries.html

这是关于它的另一个问题: 为什么不是所有的 boost 库都只有标头?

ps 通常最好将 boost 库分开并在您的 makefile 中执行以下操作:

对于编译: CXXFLAGS += -I/path/to/boost/include

对于链接: LDPATH += -L/path/to/boost/lib

这使得升级您的增强版本变得更加容易,因为您只需在一个地方更改路径。

于 2013-05-10T06:29:14.223 回答