当前位置:  开发笔记 > 编程语言 > 正文

使用dlopen加载库时收到"未定义的符号"错误

如何解决《使用dlopen加载库时收到"未定义的符号"错误》经验,为你挑选了2个好方法。

我正在编写一些使用动态共享库作为插件的代码.

我用于构建共享库的命令行如下所示:

cc -shared -fPIC -o module.so -g -Wall module.c

在模块中,我可以调用已在主可执行文件中加载的任何其他共享库中的函数.

但是,我无法访问可执行文件本身的(导出的)函数(我收到undefined symbol错误).

我的电话dlopen看起来像这样:

void *handle = dlopen(plugin, RTLD_NOW);

谁能告诉我的模块如何回调我的可执行文件,而不必将所有可执行文件的实用程序功能放入另一个共享库中?



1> Employed Rus..:

正确的解决方案是添加-rdynamic到主可执行文件的链接命令.这将添加适当的选项ld(当使用时GNU ld,恰好是--export-dynamic).

--export-dynamic直接添加在技​​术上是不正确的:它是一个链接器选项,因此应添加为-Wl,--export-dynamic,或-Wl,-E.这也不如-rdynamic(其他连接器具有等效的,但选项本身不同).



2> Alnitak..:

我自己找到了答案.

我不得不将--export-dynamic标志添加到主可执行文件的链接选项中.

创建动态链接的可执行文件时,将所有符号添加到动态符号表中.动态符号表是在运行时从动态对象可见的符号集.

如果不使用此选项,则动态符号表通常仅包含链接中提到的某个动态对象引用的那些符号.

如果使用"dlopen"加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有