我正在尝试将一些代码从 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 目录和与多个奇怪版本或其他任何东西的链接。任何帮助将不胜感激。