gpt4 book ai didi

c++ - 将 C++ 共享库链接到 C 程序时如何避免错误

转载 作者:行者123 更新时间:2023-11-28 04:47:46 25 4
gpt4 key购买 nike

我正在使用一个库,该库随通常的 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*)'(以及一些类似的)

首先:有人可以向我解释一下,为什么我在链接共享库时必须小心(使用 g++,即使二进制文件仅使用 C 代码)?我的印象是,共享二进制文件的链接已经完成,因此链接不应引入任何新的依赖关系,或者依赖关系已经解决(在这种情况下 libMain 会知道它需要 libc++ 并且已经引用/存储/无论小 Sprite 正在做什么)

其次:通过阅读 AutoTools 文档,我发现程序的链接器是根据其源文件选择的。由于 libMain 使用 C++ 文件,因此它与 g++ 链接。 binTool 仅使用 C 文件,因此它与 gcc 链接。但是 binTool 也链接 libMain,它是 C++ 链接的,似乎需要与 g++ 链接。
那么罪魁祸首在哪里呢?是不是 AutoTools 为 binTool 发出了错误的链接器命令?或者 g++ 在链接 libMain 时应该做些不同的事情吗?

供引用:gcc 版本 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

最佳答案

正如我所说,您可以将一个共享库(在构建该库时)与另一个共享库链接起来。参见 this回答详情。阅读 Drepper 的 How To Write Shared Libraries纸。

您可能应该重新配置、重新编译和重新构建您的 libMain。您想将它显式-lstdc++ 链接。

也许将一些 LDFLAGS=-lstdc++LIBES=-lstdc++ 传递给 libMainconfigure 可能帮助。参见 this .

顺便说一句,有一些用 C++ 编码并可从纯 C 程序调用的 autoconf-ed 库(例如 libgccjit ),它们与 -lstdc++

链接

关于c++ - 将 C++ 共享库链接到 C 程序时如何避免错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48929998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com