2013-05-10 60 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