我正在尝试将一些代码从PC移植到Ubuntu,由于在linux下开发经验有限,我遇到了一些问题。
我们使用CMake来生成我们所有的构建工具。在windows下,我正在创建VS2010项目,而在Linux下,我正在创建项目。我已经成功地实现了我的OpenCV的移植,但是我很头疼地试图移植我的线程增强应用程序。
这样我们就清楚了,到目前为止,我在一个干净的Ubuntu 12安装上所遵循的步骤。(我已经做了两个干净的重新安装来尝试修复潜在的库错误,现在我只是放弃并询问):
到目前为止,这就是我所做的。我可以使用CMake创建eclipse项目,没有任何错误,所以CMake成功地找到了boost安装。当我尝试通过eclipse构建时,我遇到了问题;我试图构建的应用程序使用boost::asio作为一些UDP I/O,并使用boost::线程为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帖子中收集到的一些Gotchas已经检查过了:
SET(Boost_USE_STATIC_LIBS ON)。我在这里已经完全没有想法了,我已经尝试过在本地做一些助推和其他的东西,但没有取得任何成功。我甚至重新安装了Ubuntu,以确保我没有使用多个奇怪的版本或其他任何东西完全破坏库目录和链接。任何帮助都将不胜感激。
发布于 2012-09-30 03:33:40
正确的机制是使用线程包:
find_package(Threads)
#...
target_link_libraries(my_app ${CMAKE_THREAD_LIBS_INIT} ...)发布于 2012-09-26 05:35:19
在构建目标时,添加-lpthread,它将编译。
看这个other thread。
发布于 2012-09-26 06:27:46
好吧,所以我找到了解决办法。
这与链接命令中没有-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)更改为其他函数,或者使用CMake命令FindThreads链接到p线程中,但我不知道现在如何做到这一点,而且由于时间的损失,我的盘子里还有更多重要的东西。有趣的是,我注意到我的link命令在末尾一个接一个地附加了两个-lpthread标志,但是所有的东西仍然很高兴地编译。
https://stackoverflow.com/questions/12594704
复制相似问题