我有一个基于 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/