【问题标题】:Boost "undefined reference" errors even with -lboost_thread即使使用 -lboost_thread 也会增加“未定义的引用”错误
【发布时间】:2017-06-12 20:27:41
【问题描述】:

我在尝试使用 boost::shared_mutex 时遇到了一些奇怪的编译器/链接器错误。我在运行 32 位 rhel 6.2 的 VM 上使用 boost v1.61。

导致错误的代码:

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

我搜索过的所有地方都说这些错误意味着我需要链接 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()'

【问题讨论】:

  • 请显示编译和链接命令调用,而不仅仅是 Cmake 选择显示的内容。我想你可以在 cmake 日志文件中找到它。

标签: c++ linux boost


【解决方案1】:

原来我的问题和其他人一样。

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

深入研究我的项目后,我意识到我已将boost_thread 添加到我的发布版本中,但没有添加到我试图编译的单元测试版本中。在单元测试的 CMakeLists.txt 中添加boost_thread 立即消除了错误。

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2022-11-26
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多