web-dev-qa-db-ja.com

Boost(Homebrew)Mac c ++とリンクする

こんにちは、スレッディングライブラリを使用するためにboostとリンクしようとしていますが、ビルドするようには見えません。

HomeBrew(macパッケージインストーラー)を使用してboostをインストールしましたが、/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を削除すると、次のようなエラーが発生します。

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
20
JonMorehouse

オプションなしでbrew install boostを使用したばかりの場合、これは静的と動的の両方の64ビットバイナリを構築します。

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

Boostライブラリは、/usr/local/Cellar/-(/usr/local/libおよび/usr/local/include)の実際のバイナリとヘッダーにシンボリックリンクされています。 PATHにはこれらを含める必要があるため、makefileでこれらを指定する必要はありません。

Brew(拡張gccによる)は通常、デフォルトで64ビットのバイナリを構築します。これは、エラー出力からBoostライブラリが構築されていることに注意してください。 (これらのツールotoolfileまたはlipoを使用して、ライブラリがどのアーキテクチャであるかを確認できます)

17
teopeurt

Jesse Goodが示しているように、-mtサフィックスに問題があります。これをもう一度実行しているすべてのユーザー(Windowsでも):

-mtサフィックス(マルチスレッドサポートを表す)は、LinuxブーストインストールではなくMacなどで使用されていることがわかりました。 LinuxのBoostはまだマルチスレッドをサポートしています。これは単なる命名規則です。これについては https://stackoverflow.com/a/2310892 も参照してください。

そのため、MacとWindowsではリンクオプションのすべてのブーストライブラリに-mtサフィックスを追加する必要がありますが、Linuxでは追加しないでください。 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()
11
orzechow