c++ - 在 ARM 架构上构建时,使用 boost 的动态库具有 undefined reference

标签 c++ linux boost linker raspberry-pi

我有一个基于 C++ 的动态库,是为严重依赖 boost 的三大操作系统构建的。目前,我正在为树莓派编译它。我花了一段时间才找到让库构建的神奇词语(-frepo 作为编译器标志是关键,但我承认我不确定为什么会出现这种情况)。

现在,当我尝试链接到该库时,我的库进行的每个 boost 调用都会收到“ undefined reference ”错误,即:

//`libmylib.so`: undeifined reference to `boost::shared_ptr<boost::detail::thread_data_base>::shared_ptr()'

当我构建 libmylib.so 时,我还构建了一个自定义版本的 boost 作为 libboost.a。这一切都可以在其他操作系统和非 ARM 架构上正常编译和链接,因此我尝试将 -lboost 作为标志之一,但我仍然从 libmylib.so 中得到同样过多的 undefined reference 错误。

不用说,我所有的路径都是正确的。

树莓派上的链接行为似乎与其他 Linux 系统上的有所不同。例如,我构建了一个使用 libpthread 的静态库 (libmythread.a)。当我链接到该 libmythread.a 时,我也会收到 undefined reference 错误,除非我还在构建配方中使用 -lpthread 。在运行 Fedora 的 Thinkpad 上,我永远不需要这样做,因为我在静态库 libmythread.a 的编译中包含了 -lpthread

我很想找到一个教程或指南来解释这些差异。我也很想克服它们!

我还在传统的 Linux 机器上尝试了相同的构建,一切都链接良好,没有问题。至少我知道我的构建过程是好的。不过,这确实打开了一种可能性,即 -frepo 标志正在做一些我不理解的有趣的事情,这可能是问题的根源。

最佳答案

已解决。最终,问题源于 -frepo 标志。这是编译一个名为 legacy_abi.cpp 的文件所必需的,该文件是我的库的一部分,以允许第三方开发人员使用旧的和更奇特的操作系统/编译器。这在 Pi 上是不需要的,所以我只是将其从构建的有问题的文件中删除,删除了 -frepo 标志,然后很高兴。

最后一点,aptitude(无论如何,对于 Pi)只能提供最高 1.49 的 boost (据我所知)。我的项目需要 boost >= 1.50。这是一个继承的项目,所以我仍在发现它的所有小特质。

关于c++ - 在 ARM 架构上构建时,使用 boost 的动态库具有 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31037807/

相关文章:

c++ - CGAL 切片器 : How to perform a mesh cut?

linux - 使用 shell 脚本反转旧补丁后应用新补丁

c++ - BOOST_NO_EXCEPTIONS 是否保证与 -fno-exceptions 兼容?

c++ - boost::recursive_variant 接受 map,但拒绝 unordered_map

linux - vim 的全局目录侧边栏

c++ - 使用 boost 线程 : Signal and wait for termination

c++ - exc_bad_access 错误 xcode5 c++ sdl2

c++ - 如何创建一个返回成员函数指针的成员函数?

c++ - 仅绘制多个帧中存在的轮廓以消除闪烁

Linux:匹配一个表达式,然后删除整个相关 block