2017-06-12 4 views
0

Ich bekomme einige seltsame Compiler/Linker-Fehler, wenn Sie versuchen, boost :: shared_mutex zu verwenden. Ich verwende Boost v1.61 auf einer VM mit 32-Bit-Rhel 6.2.Boost "undefined Referenz" Fehler auch mit -lboost_thread

Code, der Fehler verursacht:

HPP-Datei:

#include <boost/thread/shared_mutex.hpp> 

class SharedData 
{ 
public: 
    SharedData(); 
    ~SharedData(); 

    void packMessage(std::shared_ptr<Message> s); 

private: 
    // mutex that allows multiple read, single write protection 
    boost::shared_mutex m_sharedMutex; 
}; 

CPP-Datei:

void SharedData::packMessage(std::shared_ptr<Message> s) 
{ 
    // get shared read access 
    boost::shared_lock<boost::shared_mutex> lock(m_sharedMutex); // <- this line causes the errors 

    // read stuff here 
} 

make Ausgang:

CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::detail::interruption_checker::interruption_checker(pthread_mutex_t*, pthread_cond_t*)': 
/usr/local/include/boost/thread/pthread/thread_data.hpp:195: undefined reference to `boost::detail::get_current_thread_data()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::condition_variable::wait(boost::unique_lock<boost::mutex>&)': 
/usr/local/include/boost/thread/pthread/condition_variable.hpp:81: undefined reference to `boost::this_thread::interruption_point()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::shared_mutex::lock_shared()': 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:186: undefined reference to `boost::this_thread::disable_interruption::disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
collect2: error: ld returned 1 exit status 
make[2]: *** [bin/tester] Error 1 

Überall habe ich gesucht gesagt hat tha t diese Fehler bedeuten, ich brauche die boost_thread Bibliothek zu verknüpfen, die ich in meiner Cmake Datei getan habe (boost_system für anderen Code in demselben Projekt enthält):

target_link_libraries(${BINARY_NAME} boost_thread boost_system) 

Aber die Fehler bestehen bleiben.

Ursprünglich verwendete ich die boost 1.41-Bibliotheken, die bereits auf meinem Computer installiert waren. Wenn ich diese Fehler treffe, habe ich yum remove boost-devel ausgeführt und dann boost 1,61 manuell installiert, um zu sehen, ob das die Fehler beheben würde. Gibt es etwas, das ich zu den ./bootstrap.sh oder ./b2 install Befehlen hinzufügen musste? Ich kann libboost_thread.a in /usr/local/lib sehen, also nahm ich an, dass die Thread-Bibliothek korrekt erstellt wurde.

Haben Sie irgendwelche Gedanken, was diese Fehler verursacht? Vielen Dank!

Edit: Cmake Logbuch haben nichts nützlich ich sehen konnte, aber make VERBOSE=1 gibt die folgende Ausgabe:

cd /home/craig/dev/myProject/build/test && /usr/bin/cmake -E cmake_link_script CMakeFiles/tester.dir/link.txt --verbose=1 
/opt/rh/devtoolset-2/root/usr/bin/c++ -std=c++11 -ggdb -Wall -Werror -fprofile-arcs -ftest-coverage -fPIC -O0 -pedantic -Wl,--export-dynamic CMakeFiles/tester.dir/utilities/googletest/googletest/src/gtest-all.cc.o CMakeFiles/tester.dir/tester.cpp.o CMakeFiles/tester.dir/SharedData/testSharedData.cpp.o CMakeFiles/tester.dir/Common/testFifo.cpp.o CMakeFiles/tester.dir/Common/testCsu.cpp.o CMakeFiles/tester.dir/Messages/testMessage.cpp.o CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o CMakeFiles/tester.dir/__/src/Common/Fifo.cpp.o CMakeFiles/tester.dir/__/src/Common/Csu.cpp.o -o ../bin/tester -rdynamic -lboost_system -lpthread 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::detail::interruption_checker::interruption_checker(pthread_mutex_t*, pthread_cond_t*)': 
/usr/local/include/boost/thread/pthread/thread_data.hpp:195: undefined reference to `boost::detail::get_current_thread_data()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::condition_variable::wait(boost::unique_lock<boost::mutex>&)': 
/usr/local/include/boost/thread/pthread/condition_variable.hpp:81: undefined reference to `boost::this_thread::interruption_point()' 
CMakeFiles/tester.dir/__/src/SharedData/SharedData.cpp.o: In function `boost::shared_mutex::lock_shared()': 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:186: undefined reference to `boost::this_thread::disable_interruption::disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
/usr/local/include/boost/thread/pthread/shared_mutex.hpp:193: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()' 
+1

Bitte zeigen Sie einen Befehl zum Kompilieren und Verknüpfen von Befehlen und nicht nur, was Cmake anzeigen möchte. Ich denke, Sie können es in der cmake-Protokolldatei finden. – jww

Antwort

0

Stellt sich meine Frage heraus ist genau wie alle anderen.

@jww vorgeschlagen Ich zeige die tatsächliche Compile und Link-Befehl Aufruf, nicht CMake-Ausgabe, die ich zu meiner Frage hinzugefügt habe. Wie Sie sehen, verbindet der Befehl boost_system und pthread, aber nicht boost_thread.

In mein Projekt eingravierend realisierte ich, dass ich boost_thread meinem Versionsbau hinzugefügt hatte, aber nicht in meinem Einheitstestaufbau, der ich kompilieren wollte. Durch Hinzufügen von boost_thread zu CMakeLists.txt des Komponententests wurde der Fehler sofort behoben.