2013-05-10 61 views
2

我试图使用Boost.Tokenizer库。在我PROG.cpp,我有以下几点:C++:获得Boost工作;关于包含路径和链接库的问题

#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 [email protected] $^ $(LDFLAGS) 

## other targets 

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

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

然后我手动添加了包含路径CXXFLAGS

-I/opt/local/include/ 

(这是从MacPorts的路径。)

然后我试图包括标记生成器库,但在/opt/local/lib/我有libboost_atomic-mt.dyliblibboost_chrono-mt.dylib等,但没有像tokenizer。那时我很困惑。由于图书馆没有链接,我认为这仍然行不通。令人惊讶的是,该程序建立,链接和运行完美。

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

(1)我没有明确链接反对boost,所以boost被链接器视为标准库吗? (2)如果boost像标准一样处理,为什么头文件不是标准的?

(3)为什么有libboost_atomic-mt.dylib,libboost_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/ 

回答

7

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

但是,对于少数库,serialiser和其他一些库,只有很多污染代码才能使头包含方法合理。我确信关于实现何时包含在头中以及何时不包含的更好,更严格的定义。

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

下面是关于它的另一个问题: Why are not all boost libraries header-only?

附: 一般来说是更好地保持Boost库分开,并在你的makefile这样做:

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

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

这使得它更容易升级提升版本因为你只需要在一个地方改变路径。

+0

谢谢,完全解决了我所有的疑惑。 – 4ae1e1 2013-05-10 07:42:13