即使使用-lboost_thread提升“未定义引用”错误

问题描述:

当尝试使用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

原来我的问题是,像其他人一样的。

@jww建议我显示实际的编译和链接命令调用,而不是CMake的输出,我已经添加到我的问题。如您所见,该命令链接boost_systempthread,但不是boost_thread

挖掘我的项目我意识到我已经添加了boost_thread到我的发布版本,但没有进入我的单元测试版本,这正是我试图编译的。将boost_thread添加到单元测试的CMakeLists.txt中,立即删除错误。