2016-07-06 6 views
2

私は、ソースからビルドするサードパーティのlib(Box2D-MT)を使用するアプリケーションを構築しています。リンクする際、私はこの未定義の参照のエラーを取得:。std :: thread :: _ M_start_threadへの未定義の参照を取得する

b2Threading.cpp:(.text._ZNSt6threadC2IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_[_ZNSt6threadC5IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_]+0xa4): 
undefined reference to 'std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)())' 

私はグラムを構築しています++と

-lBox2D -lpthread -lrt -ldl -lstdc++ 

とのリンクも、私は++のlibstdcに探して

-std=c++11 

でコンパイルしています同様のシンボルが存在することがわかります(「T」です):

nm -C /usr/lib/gcc/x86_64-linux-gnu/4.9.2/libstdc++.a | grep _M_start_thread 
0000000000000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 

ですが、このオーバーロードは2番目のパラメータを使用しません。

私はすべてのインターネットを同様のもので検索しましたが、誰もその前に(この文脈では)この問題を抱えていないようです。

なぜこのエラーが発生するのか、どのように解決できるかについてのヒントはありますか?

+0

'-pthread'の代わりに' -pthread'コンパイラフラグを使います。コンパイルとリンクに使用します。 –

+0

@πάνταῥεthatはこれを試しましたが、まったく同じエラーが発生します –

+1

** ** ** ** ** **完全なリンクコマンドは何ですか? –

答えて

1

ヘッダーとライブラリのバージョンが一致していないように見えます。これは私が持っているものです:

$ nm -C /pkgs/gcc/4.9.2/lib/libstdc++.a | grep std::thread::_M_start_thread 
00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 

$ nm -C /pkgs/gcc/5.2.0/lib/libstdc++.a | grep std::thread::_M_start_thread 
00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 
00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) 

$ fgrep -r M_start_thread /usr/intel/pkgs/gcc/4.9.2/include/ 
/pkgs/gcc/4.9.2/include/c++/4.9.2/thread:  _M_start_thread(_M_make_routine(std::__bind_simple(
/pkgs/gcc/4.9.2/include/c++/4.9.2/thread: _M_start_thread(__shared_base_type); 

$ fgrep -r M_start_thread /usr/intel/pkgs/gcc/5.2.0/include/ 
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread:  _M_start_thread(_M_make_routine(std::__bind_simple(
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread:  _M_start_thread(_M_make_routine(std::__bind_simple(
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread: _M_start_thread(__shared_base_type, void (*)()); 
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread: _M_start_thread(__shared_base_type); 
+0

OK、これが該当する可能性があります。私はBox2Dをビルドすると、それがリンクするアプリケーションをビルドするときとは違ういくつかの異なるヘッダ/ライブラリを使用すると思います。 どのようなものが使用されているのか、どのように制御できますか?これは、使用しているビルドシステム(cmake)に固有のものかもしれませんが、もっと一般的な解決策があります(システムからヘッダ/ライブラリの1つだけを削除するなど)? –

+0

システムをチェックしました。 4.8と4.9のlibs。 libには必要なオーバーロードが含まれていません。 libsにない場合、ヘッダーにはどのように参照が含まれている可能性がありますか? –

関連する問題