我试图使用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.dylib
,libboost_chrono-mt.dylib
等,但没有什么像tokenizer
。当时我很困惑。我以为那是行不通的,因为该库未链接到该库。令人惊讶的是,该程序可以完美地构建,链接和运行。所以我现在真的很困惑。这里有一些问题:
(1)我没有明确链接到boost,所以链接器将boost视为标准库?
(2)如果将boost视为标准,为什么 header 不是标准的?
(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/
最佳答案
大多数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版本变得更加容易,因为您只需要在一个地方更改路径即可。