21

こんにちは、boost とリンクしてスレッド ライブラリを使用しようとしていますが、ビルドできないようです。

Boost を HomeBrew (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
4

2 に答える 2

18

オプションなしで使用brew install boostした場合は、静的および動的の両方の 64 ビット バイナリが構築されます。

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

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

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

于 2012-11-21T17:39:55.340 に答える
12

Jesse Good が示したように、-mt サフィックスに問題があります。これに再び実行されるすべての場合(Windowsでも):

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

そのため、Linux ではなく、Mac と Windows のリンク オプションですべてのブースト ライブラリに -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()
于 2013-02-23T12:10:44.643 に答える