【发布时间】:2018-02-22 14:33:03
【问题描述】:
我正在使用一个库,它带有通常的 AutoTools 生成的configure && make && make install 过程。该库包含一个主(共享)库和一些工具,主要是用 C 语言编写的。
现在我遇到了一个问题,其中一个工具的构建在使用仪器时失败(Score-P 包装了编译器调用以发挥其魔力)。
我将其缩小到以下事实:
libMain 使用 C 文件和 1 个 C++ 文件,C 文件使用 gcc 编译,C++ 文件使用 g++。该库作为共享库与 g++ 链接。
binTool 仅使用 C 文件,但链接到 libMain。
这在没有仪器的情况下有效。但是,在使用时,它会在与使用 C++ 功能的 g++ 链接时添加额外的库。将 binTool 与 gcc 链接然后给出undefined reference to 'operator delete[](void*)'(以及一些类似的)
首先:有人可以向我解释一下,为什么我在链接共享库时必须小心(即使二进制文件只使用 C 代码,也要使用 g++)?我的印象是,共享二进制文件的链接已经完成,所以链接不应该引入任何新的依赖关系或者依赖关系已经解决(在这种情况下,libMain 会知道它需要libc++ 并且已经引用了它/存储/无论精灵在做什么)
第二:通过阅读 AutoTools 文档,我发现程序的链接器是根据其源文件选择的。由于libMain 使用 C++ 文件,因此它与 g++ 链接。 binTool 仅使用 C 文件,因此它与 gcc 链接。但是binTool 也链接了libMain,它是 C++ 链接的,似乎需要与 g++ 链接。
那么罪魁祸首在哪里呢? AutoTools 是否为binTool 发出了错误的链接器命令?还是 g++ 在链接libMain 时应该做些不同的事情?
供参考:gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
ldd libMain:
linux-vdso.so.1
librt.so.1
libpthread.so.0
libm.so.6 libc.so.6
libgcc_s.so.1
libdl.so.2
libnuma.so.1
libltdl.so.7
【问题讨论】:
-
你的问题不清楚,应该有一些minimal reproducible example。请注意,在 Linux 上,共享库可以与另一个共享库链接(当您构建该库时)。特别是,您可以(并且可能应该)通过将
libMain与libstdc++链接来构建它 -
顺便说一句,如果
libMain是开源的,你最好在你的问题中给它命名(并给出它的 URL),并且你可能会对其进行错误报告 -
另见this非常相关的答案
-
好主意,我通常会这样做,但在这种情况下,我未能创建 MWE。一开始我没有尝试,因为它会很复杂(包括至少 4 个不同的文件内置到 2-3 个库和一个二进制文件中)但是在研究了 why 之后我未能创建 MWE(它没有重现所描述的行为)我找到了解决方案。
标签: c++ gcc linker shared-libraries autotools