我试图使用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 include路径添加到CXXFLAGS:
-I/opt/local/include/

(这是来自MacPorts的路径。)

然后,我尝试包括Tokenizer库,但是在/opt/local/lib/中,我有libboost_atomic-mt.dyliblibboost_chrono-mt.dylib等,但没有什么像tokenizer。当时我很困惑。我以为那是行不通的,因为该库未链接到该库。令人惊讶的是,该程序可以完美地构建,链接和运行。

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

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

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

(3)为什么会有libboost_atomic-mt.dyliblibboost_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/

最佳答案

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

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

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

这是另一个问题:
Why are not all boost libraries header-only?

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

对于编译:CXXFLAGS += -I/path/to/boost/include
对于链接:LDPATH += -L/path/to/boost/lib
这使升级Boost版本变得更加容易,因为您只需要在一个地方更改路径即可。

09-25 16:30
查看更多