我有一个可执行文件和一个动态库(.so)。该库导出一些符号并且可执行文件成功调用它。但我想让库调用可执行文件的功能成为可能。我尝试在可执行文件中执行以下操作:
//test
extern "C" void print(const char * str) {
std::cout << str << std::endl;
}
以及图书馆中的这个:
extern "C" void print(const char *);
但当我打电话时dlopen
在可执行文件中(加载库)它返回错误undefined symbol: print
。我该如何修复它?
在 Linux/ELF 中你可以通过-export-dynamic
链接器的选项(-rdynamic
在编译器驱动程序上gcc
),因此可执行文件中的符号将导出到共享对象。
你会有一个假人print
库中的实现,这将被可执行文件的实现所掩盖,因为通常在共享对象之前搜索可执行文件以进行符号解析。
这样做的缺点是它的粒度不是很细,您最终可能会覆盖一些您不打算覆盖的符号。更细粒度的选项是创建要导出的符号列表:
{
print;
<other symbols>
};
并将该列表传递给链接器,例如来自海湾合作委员会:-Wl,--dynamic-list=<file with list of symbols>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)