2017-06-12 59 views
0

當嘗試使用boost :: shared_mutex時,出現了一些奇怪的編譯器/鏈接器錯誤。我在運行32位rhel 6.2的虛擬機上使用boost v1.61。即使使用-lboost_thread提升「未定義引用」錯誤

HPP文件:

#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文件:

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輸出:

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 

無論我已經搜查曾表示,導致錯誤

代碼THA牛逼這些錯誤的意思是,我需要鏈接boost_thread庫,這是我在我的cmake文件所做的(boost_system包括對該同一項目其他代碼):

target_link_libraries(${BINARY_NAME} boost_thread boost_system) 

但是錯誤仍然存​​在。

最初我使用的是我的機器上已安裝的boost 1.41庫。當我遇到這些錯誤時,我運行了yum remove boost-devel,然後手動安裝了boost 1.61來查看是否能糾正錯誤。有什麼額外的我需要添加到./bootstrap.sh./b2 install命令?我可以在/usr/local/lib中看到libboost_thread.a,所以我認爲這意味着線程庫的構建是正確的。

有什麼想法是什麼導致這些錯誤?謝謝!

編輯: CMake的日誌沒有任何有用的東西,我可以看到,但make VERBOSE=1給出了下面的輸出:

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

請顯示編譯和鏈接命令調用,而不僅僅是Cmake選擇顯示的內容。我認爲你可以在cmake日誌文件中找到它。 – jww

回答

0

原來我的問題是,像其他人一樣的。

@jww建議我顯示實際的編譯和鏈接命令調用,而不是CMake的輸出,我已經添加到我的問題。如您所見,該命令鏈接boost_systempthread,但不是boost_thread

挖掘我的項目我意識到我已經添加了boost_thread到我的發佈版本,但沒有進入我的單元測試版本,這正是我試圖編譯的。將boost_thread添加到單元測試的CMakeLists.txt中,立即刪除錯誤。

相關問題