4ae*_*1e1 2 c++ linker boost include
我试图使用Boost.Tokenizer库.在我PROG.cpp,我有以下内容:
#include <boost/tokenizer.hpp>
Run Code Online (Sandbox Code Playgroud)
而我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
Run Code Online (Sandbox Code Playgroud)
它无法编译,因为boost/tokenizer.hpp无法找到:
fatal error: boost/tokenizer.hpp: No such file or directory
Run Code Online (Sandbox Code Playgroud)
然后我手动添加了boost include路径CXXFLAGS:
-I/opt/local/include/
Run Code Online (Sandbox Code Playgroud)
(这是MacPorts的路径.)
然后我试图包括标记生成器库,但在/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++链接机制不是很熟悉; 谈到提升,这是我的第一个提升计划.所以我真的很感激详细解释.提前致谢!
作为参考,这是我提取的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/
Run Code Online (Sandbox Code Playgroud)
大多数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
这样可以更轻松地升级您的升级版本,因为您只需在一个位置更改路径.
| 归档时间: |
|
| 查看次数: |
14573 次 |
| 最近记录: |