Immer undefined reference to std::thread::_M_start_thread

Ich Baue eine app, die verwendet ein 3rd-party-lib (Box2D-MT), die ich bauen aus den Quellen. Beim verknüpfen, bekomme ich undefined reference-Fehler:

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 (*)())'

Baue ich mit g++ und der link mit der

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

bin ich auch kompilieren mit

-std=c++11

Blick in libstdc++.eine die ich sehen kann, eine ähnlich dieses symbol vorhanden ist (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 überlastung nicht nehmen, einen zweiten parameter.

Ich gesucht habe alle das internet für etwas ähnliches, aber niemand scheint zu haben, hatte dieses Problem vor (in jedem Kontext).

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

  • Verwenden Sie die -pthread compiler-flag anstatt des -lpthread. Verwenden Sie zum kompilieren und verknüpfen.
  • versucht das jetzt, ich bekomme genau den selben Fehler
  • Was ist Ihr full link-Befehl?
  • g++ -L./3rdparty/easyunit/ -o „“foo“ Objekte.o -leasyunit -lGLEW -lglfw -lGL -lX11 -lXxf86vm -lpng -lBox2D -lrt -lpthread -ldl –
  • Ich habe die libs in unterschiedlicher Reihenfolge, aber immer das gleiche Ergebnis
  • Ich erwähnte Verwendung -ptthread für das kompilieren von und Verknüpfung.
  • Ich Tat, aber dann änderte ich es zurück, da gab es keinen Unterschied (habe den gleichen Fehler). Was ist der technische Unterschied zwischen den beiden?



One Reply
  1. 2

    Sieht aus wie ein Header/libraries version mismatch. Dies 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);
    • ok, dies könnte der Fall sein. Ich nehme an, wenn ich Baue Box2D verwendet es einige unterschiedliche Kopf – /Bibliotheken als wenn ich bauen meine app, die links zu. Wie kann ich feststellen, welche es verwendet, und wie kann ich es kontrollieren? Dies könnte auf die spezifische build-system verwendet (cmake), aber vielleicht gibt es einige weitere Allgemeine Lösung (wie das entfernen Sie alle aber eine version von Header/libs vom system?)
    • Ich habe das system, ich habe nur 4.9.2 include-Dateien und 4.8 und 4.9 libs. Weder Bibliotheken enthalten, die benötigt überlastung. Wie ist es möglich, dass die Header enthalten einen Verweis auf es, wenn es nicht in den libs?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.