C ++:让Boost工作;关于包含路径和链接库的问题

时间:2013-05-10 06:18:52

标签: c++ boost linker include

我试图使用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

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

-I/opt/local/include/

(这是MacPorts的路径。)

然后我尝试包含Tokenizer库,但在/opt/local/lib/我有libboost_atomic-mt.dyliblibboost_chrono-mt.dylib等,但没有像tokenizer那样。那个时候我很困惑。我认为由于图书馆没有被链接,所以仍然无法工作。令人惊讶的是,该程序已经构建,链接并完美运行。

所以我现在真的很困惑。以下是一些问题:

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

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

(3)为什么有libboost_atomic-mt.dyliblibboost_chrono-mt.dylib等但不是tokenizertokenizer属于哪个动态库?

我对g++链接机制不太熟悉;谈到提升,这是我的第一个提升计划。 所以我非常感谢您的详细解释。提前致谢!

供参考,这是我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/

1 个答案:

答案 0 :(得分:7)

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

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

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

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

P.S。 通常最好将boost库保持独立,并在makefile中执行以下操作:

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

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

这样可以更轻松地升级您的升级版本,因为您只需要在一个地方更改路径。