一位同事给了我一个共享库的修改版本,在那里他添加了一个GTK小部件
检查共享库文件时,我发现新的小部件功能被定义为本地而非全局
我试图在函数上设置GCC的可见性属性(在声明本身之后,在分号之前),它周围有G_BEGIN_DECLS和相同的公共头,并定义为库中正确导出的其他文件。
是否存在我可能缺少的链接器命令行选项?一个"可以"的文件列表gcc使用的导出,也许是导出函数的另一个定义?
答案 0 :(得分:2)
检查共享库文件时,我看到新的窗口小部件功能被定义为本地而非全局。
默认情况下,导出共享库中的所有符号(除非您使用-fvisibility=hidden
或protected
进行编译。
因为观察到你的符号是LOCAL
,所以你的链接命令使用链接器版本脚本来控制符号可见性(隐藏除了显式导出的符号之外的所有符号),并且你有没有修改该版本脚本以将您的功能添加到导出列表。
在链接命令行中查找-Wl,--version-script=...
,并相应地修改版本脚本。
另见this answer。
答案 1 :(得分:2)
我发现该库使用正则表达式来过滤导出(-export-symbols-regex
开关),添加另一个正则表达式使符号正确导出,现在我所有内容都正确链接。