0

我正在尝试将一些代码从 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 帖子中收集并已经检查过的一些问题:

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

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

4

3 回答 3

2

正确的机制是使用 Threads 包:

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

另请参阅cmake 和 libpthread

于 2012-09-30T03:33:40.330 回答
1

当您构建目标时,添加-lpthread它会编译。

请参阅其他线程

于 2012-09-26T05:35:19.530 回答
0

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

这与链接命令中缺少 -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 for 或使用 CMake 命令FindThreads在需要时链接到 pthread,但我目前不确定如何执行此操作,并且我的盘子上有更多重要的事情给时间我迷路了。有趣的是,我注意到我的链接命令现在-lpthread在末尾附加了两个标志,一个接一个,但一切仍然很愉快地编译。

于 2012-09-26T06:27:46.337 回答