2011-07-12 9 views
4

私はこれをしばらくは続けてきました。状況を理解しているようには見えません。何が起きているのかを完全には理解していないからです(これが私がここに来た理由です)。これは、Windows上でブーストで奇妙なリンカーエラーが発生しましたか?

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


void helloworld() { 
    std::printf("HELLO FROM A BOOST THREAD!"); 
} 

int main(int argc, char **argv) { 
    boost::thread t(&helloworld); 
    t.join(); 
} 

を次のように

私はブーストのHello Worldのようなものをやっています。私はBoostディレクトリをC:\ Boostに保存しました。私はブートストラップとbjamを走らせ、すべての.libファイルを含むstage/libフォルダを持っています。ブースト/スレッドライブラリに関連するLIBファイルがされています。今、私はコンパイル

libboost_thread-vc100-mt.lib 
libboost_thread-vc100-mt-1_46_1.lib 
libboost_thread-vc100-mt-gd.lib 
libboost_thread-vc100-mt-gd-1_46_1.lib 

g++ -c main.cpp -I/Boost 

ラインが正常に動作することを、私はmain.o.を取得します次に:

g++ -o test.exe main.o -L/Boost/stage/lib -llibboost_thread-vc100-mt 

これは問題が発生する場所です。まず第一に、私が行ったように-l引数をタイプしなかった場合、MinGWはファイルを見つけることさえできませんでした。私がしようとした場合、意味:代わりに、私は上記のそれを入力した(と私はそれが行われるべきと思ったか)道の

-lboost_thread-vc100-mt 

を、ldはありません、このようなファイルで終了します。私はこれらが私はブースト/スレッドから取得することになってるの機能が明らかにされている、と明らかにすることを伝えることができ、今どこかで

main.o:main.cpp:(.text+0x47): undefined reference to `_imp___ZN5boost6thread4joinEv' 
main.o:main.cpp:(.text+0x55): undefined reference to `_imp___ZN5boost6threadD1Ev' 
main.o:main.cpp:(.text+0x70): undefined reference to `_imp___ZN5boost6threadD1Ev' 
main.o:main.cpp:(.text$_ZN5boost6threadC1IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)]+0x23): undefined reference to `_imp___ZN5boost6thread12start_threadEv' 
collect2: ld returned 1 exit status 

:とにかく、これは今、私はその行から取得しています出力されますそれはlibファイルを見つけるので、なぜそれが正しくリンクされていないのですか?

ありがとうございました!

EDIT:ビルドが完了した後、私はbjamを使用してブーストを再構築してきました

今 "ステージ" オプション

bjam toolset=gcc stage 

、私は.Aファイルを舞台/ libフォルダに残されています、期待されるように。

g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1 

はまったく同じエラーを出力する次のように架橋、しかし

libboost_thread-mgw45-mt-1_46_1.a 
libboost_thread-mgw45-mt-d-1_46_1.a 

:これらは、ブースト/スレッドに関連するライブラリです。また試しました:

g++ -o test.exe main.o -L/Boost/stage/lib -lboost_thread-mgw45-mt-1_46_1 -static 

私はまだ迷っています。

+0

'toolset = gcc'を指定するだけでは不十分ですが、MinGWでも' target-os = windows'が必要です。 – ildjarn

答えて

5

は、問題を解決しました。ブーストのヘッダは、動的にリンクされるように構成されていますが、ユーザーが指定しない限り、動的ライブラリ(DLLの)が組み込まれていません。

--build-type=complete 

bjamを呼び出すとき。その後、アプリケーションディレクトリに適切なdllをコピーしますが、リンク時には

-L/BOOST_DIR/stage/lib -lname 

を使用してください。

+0

ありがとうございます、この解決策が働いています。私は何度もBoost-Thread "Hello world"プログラムを動かしてみましたが、Boost-Threadライブラリをコンパイルするときに '--build-type = complete'フラグを追加するまでコンパイルできませんでした。 Trung、 – TrungTN

5

ライブラリファイルのこのセット:

libboost_thread-vc100-mt.lib 
libboost_thread-vc100-mt-1_46_1.lib 
libboost_thread-vc100-mt-gd.lib 
libboost_thread-vc100-mt-gd-1_46_1.lib 

は、Visual Studio 2010のコンパイラのためのものです。 GCCでは動作しません。 gcc/MinGWを使いたい場合は、そのコンパイラ用のブーストライブラリのセットをダウンロード/ビルドする必要があります。あるいは、VS 2010をインストールしてそのコンパイラを使用することもできます(無料のVC++ 2010 Expressバージョンは、コストが問題になる場合は正常に動作します)。

パッケージ内のBoostを使用してMinGWディストリビューションを入手するには、http://nuwen.net/mingw.html(32ビットターゲットのみ、私はそうだと思います)。 MinGWのLIBSのを使用して、エラーを得ることについて答えること


:シンボルの

_imp_プレフィックスはg++は、DLL /共有ライブラリにリンクしようとしていることを示すものです。あなたが持っている.libファイルは静的ライブラリ用です(ライブラリの簡単なbjamビルドを行うときに得られるものです)。 boost/thread/detail/config.hppを見ると、Win32ビルドでは、MSVCまたはインテルコンパイラが使用されていない限り、DLLライブラリに対するビルドがデフォルトで行われます。

私はDLLライブラリをどのように構築するか正確にはわかりません - 私はそれを調べなければなりません。その間、次のコマンドを使用して、静的ライブラリにリンクするようにサンプルをビルドすることができます。 BOOST_THREAD_USE_LIBマクロビルドそれは静的ライブラリにリンクすることを期待だろうと、このような.cppファイル:

g++ -I/Boost -DBOOST_THREAD_USE_LIB -c main.cpp 
+0

私の新しい情報の編集を参照してください。 – cemulate

+0

@ user48998:私はより多くの情報で答えを更新しました。 –

+0

ありがとう、これは私が到達した同じ答えです。また、静的にリンクしたくない場合は、--build-type = completeオプションを使用してdllをビルドしてください。 – cemulate

関連する問題