【问题标题】:Linker Issues with boost::thread under linux using Eclipse and CMake使用 Eclipse 和 CMake 在 linux 下 boost::thread 的链接器问题
【发布时间】:2012-09-17 15:56:38
【问题描述】:

我正在尝试将一些代码从 PC 移植到 Ubuntu,但由于在 linux 下开发的经验有限,我遇到了一些问题。

我们使用 CMake 来生成我们所有的构建内容。在 windows 下我正在制作 VS2010 项目,在 Linux 下我正在制作 Eclipse 项目。我已经成功地移植了我的 OpenCV 东西,但是在移植我的线程增强应用程序时遇到了很大的麻烦。

我们很清楚,到目前为止我在干净的 Ubuntu 12 安装上所遵循的步骤。 (我已经完成了 2 次干净的重新安装以尝试修复潜在的库故障,现在我只是放弃并询问):

  • 使用我的包管理器安装 Eclipse 和 Eclipse CDT
  • 使用我的包管理器安装 CMake 和 CMake Gui
  • 使用我的包管理器安装 libboost-all-dev

到目前为止,这就是我所做的一切。我可以使用 CMake 毫无错误地创建 eclipse 项目,因此 CMake 成功找到了我的 boost 安装。当我尝试通过 Eclipse 构建时,就会遇到问题;我正在尝试构建的应用程序将 boost::asio 用于某些 UDP I/O,并使用 boost::thread 为 asio I/O 服务创建工作线程。我可以成功编译每个模块,但是当我开始链接时,我会收到诸如以下错误的垃圾邮件:

/usr/bin/c++       CMakeFiles/RE05DevelopmentDemo.dir/main.cpp.o CMakeFiles/RE05DevelopmentDemo.dir/RE05FusionListener/RE05FusionListener.cpp.o CMakeFiles/RE05DevelopmentDemo.dir/NewEye/NewEye.cpp.o  -o RE05DevelopmentDemo -rdynamic -Wl,-Bstatic -lboost_system-mt -lboost_date_time-mt -lboost_regex-mt -lboost_thread-mt -Wl,-Bdynamic 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In function `void boost::call_once<void (*)()>(boost::once_flag&, void (*)()) [clone .constprop.98]':
make[2]: Leaving directory `/home/david/Code/Build/Support/RE05DevDemo'
(.text+0xc8): undefined reference to `pthread_key_create'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In function `boost::this_thread::interruption_enabled()':
(.text+0x540): undefined reference to `pthread_getspecific'
make[1]: Leaving directory `/home/david/Code/Build/Support/RE05DevDemo'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In function `boost::this_thread::disable_interruption::disable_interruption()':
(.text+0x570): undefined reference to `pthread_getspecific'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_thread-mt.a(thread.o): In   function `boost::this_thread::disable_interruption::disable_interruption()':
(.text+0x59f): undefined reference to `pthread_getspecific'

我从其他 StackOverflow 帖子中收集并已经检查过的一些问题:

  • boost 库都存在于 /usr/lib 中
  • 由于无法找到 boost 标头,我没有收到任何编译错误,因此必须找到它们。
  • 我正在尝试静态链接,但我相信 eclipse 应该传递正确的参数来实现这一点,因为我的 CMakeLists.txt 包含 SET(Boost_USE_STATIC_LIBS ON)

我在这里正式没有想法,我尝试过本地构建 boost 和一堆其他东西,但没有更多成功。我什至重新安装了 Ubuntu,以确保我没有完全破坏 libs 目录和与多个奇怪版本或其他任何东西的链接。任何帮助将不胜感激。

【问题讨论】:

  • 不知何故它没有链接到pthread 库。我在命令行中没有看到-lpthread

标签: linux eclipse cmake boost-thread


【解决方案1】:

正确的机制是使用Threads包:

find_package(Threads)
#...
target_link_libraries(my_app ${CMAKE_THREAD_LIBS_INIT} ...)

另见cmake and libpthread

【讨论】:

    【解决方案2】:

    在构建目标时,添加 -lpthread 即可编译。

    看到这个other thread

    【讨论】:

    【解决方案3】:

    好的,所以我找到了解决方案。

    这与链接命令中缺少 -lpthread 标志有关。为了让 CMake 正确链接,需要编辑 TARGET_LINK_LIBRARIES 行。我的编辑是:

    原文:

    TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} )
    

    修改和工作:

    IF(WIN32)
      TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} )
    ELSE(WIN32)
      TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} pthread )
    ENDIF(WIN32)
    

    我猜我可能应该将 ELSE(WIN32) 更改为 elseif 或使用 CMake 命令 FindThreads 在需要时链接到 pthread,但我现在不确定如何做到这一点并且有考虑到我失去的时间,我盘子上的更重要的事情。有趣的是,我注意到我的链接命令现在在末尾附加了两个 -lpthread 标志,一个接一个,但一切仍然编译得很愉快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 2012-03-23
      • 1970-01-01
      • 2017-05-29
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多