2012-09-20 18 views
16

こんにちは私はスレッドライブラリを使用するためにboostとリンクしようとしていますが、構築することはできません。Boost(Homebrew)とのリンクMac C++

私は自作(MACパッケージインストーラ)でブーストをインストールし、それが/usr/local/Cellar/boost/1.50.0ディレクトリにあります。

私の主なファイルは今...

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

私のメイクファイルは、このようなものです非常に簡単です:

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を取る場合、私はこのようになりますエラーが出る:オプションを指定せずにbrew install boostを単に使用している場合は

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'接尾辞と1なしで一つのファイルをリンクしていますか? '-lboost_thread -lboost_system'または' -lboost_thread-mt -lboost_system-mt'を試してください –

+0

ちょうど-lboost_threadとリンクすると、ldのエラーが発生します:-lboost_threadのライブラリが見つかりません collect2:ldが1を返しましたexit status' – JonMorehouse

+1

両方に '-mt'を追加するとどうなりますか? –

答えて

16

、これは64ビットのバイナリをビルドする - 静的および動的の両方。

上記のコードの主な原因は、-m32オプションの使用です。これを削除すると大丈夫です。これは、32ビットビルドと64ビットライブラリをリンクしようとしていることを意味します。

ブーストライブラリは、/usr/local/Cellar/ - (/usr/local/lib/usr/local/include)の実際のバイナリとヘッダーにシンボリックリンクされています。 PATHにはこれらを含める必要があるので、makefileにこれらを指定する必要はありません。 (拡張GCCによる)醸造は、一般的に、あなたのエラー出力からBoostライブラリは、上に構築されており、デフォルトで64ビットのバイナリをビルドすること

は注意してください。あなたは-mtサフィックスに問題があるジェシー・グッドによって示されるように

+4

もし彼が32ビット用にビルドしたいのであれば? – inetknght

+0

申し訳ありませんが、私はブーストのインストールにいくつか問題があります。 brewでboostをインストールすると、/ usr/local/includeに "シンボリックリンク"が作成されず、XCodeプロジェクトにライブラリを含めるとライブラリが見つかりません。どうすれば修正できますか? –

8

(あなたはライブラリは、これらのツールotoolfileまたはlipoを使用してである建築確認することができます)。

-mtサフィックス(マルチスレッドサポート)は、Linuxのブーストインストールではなく、Macなどで使用されることが判明しました。 LinuxのBoostはまだマルチスレッド対応ですが、命名規則です。 これについては、https://stackoverflow.com/a/2310892も参照してください。あなたがMacとWindows上ではなく、Linux上のリンクオプションですべてのブーストLIBSに-mtサフィックスを追加する必要が理由です

。 (私のよう)あなたは、Linuxの共同開発者でCMakeのを使用している場合は、このよう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上に構築します(1つはマルチスレッドなし)。これは**ちょうど**命名規則ではなく、 '--without-single'を使って' homebrew'のシングルスレッド変種を明示的に無効にすることができます。しかし、表示される 'boost_thread'のためのシングルスレッド版はありません。 – Chris

関連する問題