2012-09-20 67 views
16

你好我想鏈接升壓使用線程庫,但似乎無法得到它建立。鏈接升壓(自制)Mac C++

我安裝了升壓用自制(MAC包安裝),它是在/usr/local/Cellar/boost/1.50.0目錄。

我的主要文件是很簡單的,現在......

#include <iostream> 
#include <boost/thread.hpp> 

我make文件是這樣的:

CC = g++ 


BASE_FLAGS = -m32 -wAll 

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR HEADERS 
LDFLAGS = -I/usr/local/Cellar/boost/1.50.0/include -I/opt/local/include 

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR LIB FILES 
LLIBFLAGS = -L/usr/local/Cellar/boost/1.50.0/ 

# SPECIFIY LINK OPTIONS 
LINKFLAGS = -l boost_thread-mt -lboost_system 

# FINAL FLAGS -- TO BE USED THROUGHOUT 
FLAGS = $(BASE_FLAGS) $(LLIBFLAGS) $(LDFLAGS) $(LINKFLAGS) 




# NOTE FOR BOOST -- YOU ONLY NEED TO INCLUDE THE PATH BECAUSE IT ONLY INSTALLS HEADER FILES 
main: main.cpp 
    $(CC) $(FLAGS) -o main.out main.cpp 

當我運行它,我得到一個庫未找到boost_system 。如果我參加了boost_system,然後我得到看起來像這樣的錯誤:

ld: warning: ignoring file /usr/local/lib/libboost_thread-mt.dylib, file was built for unsupported file format (0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0) which is not the architecture being linked (i386): /usr/local/lib/libboost_thread-mt.dylib 
Undefined symbols for architecture i386: 
    "boost::system::system_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o 
    "boost::system::generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 
+0

你爲什麼要鏈接一個文件,'-mt'後綴,一個沒有?嘗試'-lboost_thread -lboost_system'或'-lboost_thread-MT -lboost_system-mt' –

+0

打招呼,當我剛剛聯繫-lboost_thread它給了我LD'LD的錯誤:庫沒有找到-lboost_thread collect2:LD返回1退出狀態' – JonMorehouse

+1

將兩個「-mt」加在一起會發生什麼? –

回答

16

如果剛使用brew install boost不帶選項,這將構建一個64位二進制 - 靜態和動態兩種。

你從上面的代碼罪魁禍首是使用-m32選項,刪除這一點,你應該沒問題。這意味着您正嘗試將32位版本與64位庫鏈接。

Boost庫符號鏈接到實際的二進制文件和標頭/usr/local/Cellar/ - (/usr/local/lib/usr/local/include)。你的PATH應該包含這些,所以不需要在makefile中指定它們。

注意,BREW(通過擴展GCC)默認情況下,它從你的錯誤輸出Boost庫已經建立在普遍建立64位二進制文​​件。 (你可以通過使用這些工具來檢查庫的哪個架構otoolfilelipo

+4

如果他*想要構建32位呢? – inetknght

+0

對不起,我在安裝boost時遇到了一些問題。當我使用brew安裝boost時,它不會在/ usr/local/include中創建任何「符號鏈接」,並且如果我嘗試將庫包含在XCode項目中,它不會找到該庫,那我該如何解決它? –

8

正如Jesse Good所指出的那樣,你有一個-mt後綴問題。對於所有(甚至在Windows上)再次運行到這一點:

事實證明,使用-mt後綴(代表多線程支持),在Linux中安裝升壓不使用,但在Mac等。 Linux上的Boost仍然支持多線程,這只是一個命名約定。 另請參見https://stackoverflow.com/a/2310892

這就是爲什麼你必須使用-mt後綴添加到在Mac和Windows的鏈接選項所有的升壓庫,但不能在Linux上。 如果您使用CMake的與Linux的合作開發(像我這樣做),你可以修改的CMakeLists.txt這樣的:

if(APPLE OR WIN32) 
    target_link_libraries([other libs..] boost_thread-mt boost_system-mt) 
else() 
    target_link_libraries([other libs..] boost_thread boost_system) 
endif() 
+0

實際上,boost通常在Mac OS X上構建兩個版本(一個沒有多線程,另一個沒有多線程)。這不僅僅是一個命名約定,你可以用'--without-single'顯式地禁用'homebrew'中的單線程變體。但是,它看起來沒有'boost_thread'的單線程版本。 – Chris