c++ - GCC 将共享库链接到可执行文件

标签 c++ c gcc linker linker-errors

我有以下问题。我有一个共享库,它只是一堆链接在一起的翻译单元,所以当我编译那个共享库时,我不会得到任何链接器错误( undefined reference ,即使我可能有)。

共享库从一个可执行文件动态加载,该可执行文件还包含我的共享库正在使用的导出(我的库中使用的引用在运行时解析)。

主要问题是我想要 undefined reference 警告,这样我就可以静态修复它们,而不是等待应用程序崩溃。

我在某处读到我可以将“-Wl,--no-undefined”传递给 gcc,这样我就可以恢复这些错误,确实有效,但它也给了我可执行文件导出的所有 undefined reference 。我想将这些警告过滤到我的翻译单元的范围内。

这可能吗?如果没有,我如何定义对具有共享库导出的可执行文件的引用。

最佳答案

您可以尝试使用 -Wl,-z,now 链接库和主程序。这应该使运行时 ldso 立即解析所有引用,如果没有找到则抛出错误。

否则,我在链接器手册中没有看到一个选项说“允许此 ELF 满足符号,但实际上不将其列为 DT_NEEDED”。

您可以尝试使用 -Wl,--no-undefined 并使用脚本解析输出,这样您就可以过滤掉您知道主程序会满足的符号。

另一种选择可能是用 __attribute__((weak)) 标记你知道主程序提供的所有符号,然后仍然使用 -Wl,--no-undefined。弱符号不会被报告为错误。

关于c++ - GCC 将共享库链接到可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367365/

相关文章:

c# - 需要帮助将 C++ 定义转换为等效的 C#

c++ - 模板推导指南中的附加类型

c++ - 全屏原始分辨率下的 OpenGL 撕裂

c - 每次迭代都会替换索引中的值

c - "Undefined reference"共享库和 ldflags 错误

c++ - 使用 glm 四元数到矩阵

c - 如何使用 C 中的 read() 函数读取整数和字符?

c - 无法使用最新的 ffmpeg 库解码 mp4 文件 : av_decode_video2

c - 我可以为 gfortran 使用哪些 gcc 编译器选项

c++ - 将 std::function 类成员与编译器优化一起使用时出现段错误