2016-07-06 38 views
2

Ich baue eine App, die eine 3rd Party lib (Box2D-MT) verwendet, die ich aus Quellen erstelle. Bei der Verknüpfung, ich diese undefined reference Fehler:Undefinierter Verweis auf 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 (*)())' 

ich mit g bin Gebäude ++ und Link mit

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

auch, ich bin Kompilieren mit

-std=c++11 

Blick in libstdC++ ein. Ich kann sehen, dass ein ähnliches Symbol existiert (es ist "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>) 

aber diese Überladung nimmt keinen zweiten Parameter.

Ich habe das ganze Internet nach etwas ähnlichem gesucht, aber niemand scheint dieses Problem vorher gehabt zu haben (in irgendeinem Zusammenhang).

Irgendein Hinweis darauf, warum ich diesen Fehler bekomme und wie ich es lösen könnte?

+0

Verwenden Sie das '-pthread' Compiler-Flag anstelle von' -lpthread'. Verwenden Sie es zum Kompilieren und Verknüpfen. –

+0

@ πάνταῥεῖ versucht, dass jetzt, bekomme ich genau den gleichen Fehler –

+1

Was ist Ihr ** voll ** Link-Befehl? –

Antwort

1

Sieht aus wie ein Kopfzeilen/Bibliotheken-Versionskonflikt. Das ist, was ich habe:

$ 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, das könnte der Fall sein. Ich nehme an, wenn ich Box2D erstelle, verwendet es einige verschiedene Header/Bibliotheken, als wenn ich meine App erstelle, die darauf verlinkt. Wie kann ich feststellen, welche es verwendet, und wie kann ich es kontrollieren? Dies könnte spezifisch für das verwendete Build-System sein (cmake), aber vielleicht gibt es eine allgemeinere Lösung (wie das Entfernen aller Versionen von headers/libs vom System?) –

+0

Ich habe das System überprüft, ich habe nur 4.9.2 Include-Dateien und 4.8 und 4.9 libs. Keine der Bibliotheken enthält die erforderliche Überladung. Wie ist es möglich, dass die Header einen Verweis darauf enthalten, wenn sie nicht in den Bibliotheken enthalten sind? –