首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linker问题与boost::linux下使用Eclipse和CMake的线程

Linker问题与boost::linux下使用Eclipse和CMake的线程
EN

Stack Overflow用户
提问于 2012-09-26 04:46:19
回答 3查看 2K关注 0票数 0

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

我们使用CMake来生成我们所有的构建工具。在windows下,我正在创建VS2010项目,而在Linux下,我正在创建项目。我已经成功地实现了我的OpenCV的移植,但是我很头疼地试图移植我的线程增强应用程序。

这样我们就清楚了,到目前为止,我在一个干净的Ubuntu 12安装上所遵循的步骤。(我已经做了两个干净的重新安装来尝试修复潜在的库错误,现在我只是放弃并询问):

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

到目前为止,这就是我所做的。我可以使用CMake创建eclipse项目,没有任何错误,所以CMake成功地找到了boost安装。当我尝试通过eclipse构建时,我遇到了问题;我试图构建的应用程序使用boost::asio作为一些UDP I/O,并使用boost::线程为asio I/O服务创建工作线程。我可以成功地编译每个模块,但当我链接时,会出现以下错误:

代码语言:javascript
复制
/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帖子中收集到的一些Gotchas已经检查过了:

  • boost库都在/usr/lib中。
  • 我不会因为找不到boost头而得到任何编译错误,所以必须找到它们。
  • 我正在尝试静态链接,但我认为eclipse应该传递正确的参数,因为我的CMakeLists.txt包含SET(Boost_USE_STATIC_LIBS ON)

我在这里已经完全没有想法了,我已经尝试过在本地做一些助推和其他的东西,但没有取得任何成功。我甚至重新安装了Ubuntu,以确保我没有使用多个奇怪的版本或其他任何东西完全破坏库目录和链接。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-30 03:33:40

正确的机制是使用线程包:

代码语言:javascript
复制
find_package(Threads)
#...
target_link_libraries(my_app ${CMAKE_THREAD_LIBS_INIT} ...)

另见cmake and libpthread

票数 2
EN

Stack Overflow用户

发布于 2012-09-26 05:35:19

在构建目标时,添加-lpthread,它将编译。

看这个other thread

票数 1
EN

Stack Overflow用户

发布于 2012-09-26 06:27:46

好吧,所以我找到了解决办法。

这与链接命令中没有-lpthread标志有关。为了使CMake能够适当地链接,需要编辑TARGET_LINK_LIBRARIES行。我的编辑是:

原件:

代码语言:javascript
复制
TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} )

修改和工作:

代码语言:javascript
复制
IF(WIN32)
  TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} )
ELSE(WIN32)
  TARGET_LINK_LIBRARIES( RE05DevelopmentDemo ${Boost_LIBRARIES} pthread )
ENDIF(WIN32)

我猜想,如果需要,我可能应该将ELSE(WIN32)更改为其他函数,或者使用CMake命令FindThreads链接到p线程中,但我不知道现在如何做到这一点,而且由于时间的损失,我的盘子里还有更多重要的东西。有趣的是,我注意到我的link命令在末尾一个接一个地附加了两个-lpthread标志,但是所有的东西仍然很高兴地编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12594704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档