符号保留在本地且未正确导出

Symbols stay local and not exported properly

一位同事给了我一个共享库的修改版本,他在其中添加了一个 GTK 小部件。
在检查共享库文件时,我发现新的小部件函数被定义为本地而非全局。
我试图在函数上设置 GCC 的可见性属性(在声明本身之后,分号之前),它周围有 G_BEGIN_DECLS 和相同的通用头文件,并定义为库中正确导出的其他文件.
我可能缺少链接器命令行选项吗? gcc 使用的 "can" 导出的文件列表,也许是导出函数的另一个定义?

When inspecting the shared library file I see that the new widget functions are defined as local and not global.

默认情况下,共享库中的 所有 符号都会被导出(除非您使用 -fvisibility=hiddenprotected.

进行编译

因为观察到您的符号是 LOCAL,所以您的 link 命令可以使用 linker 版本脚本来控制符号可见性(隐藏所有符号,除了明确导出的),并且您没有修改该版本脚本以将您的函数添加到导出列表中。

在 link 命令行中查找 -Wl,--version-script=...,并适当修改版本脚本。

另见 this answer

我发现库使用正则表达式来过滤导出(-export-symbols-regex 开关),添加另一个正则表达式使符号正确导出,现在我的一切都正确链接。