我有一个可执行文件和一个动态库(.so)。该库成功导出一些符号和可执行调用。但我希望库调用可执行文件的功能。我试图在可执行文件中执行以下操作:
//test
extern "C" void print(const char * str) {
std::cout << str << std::endl;
}
这在库中:
extern "C" void print(const char *);
但是当我在可执行文件中调用dlopen
(加载库)时,它返回错误undefined symbol: print
。我该怎么办呢?
答案 0 :(得分:12)
在Linux / ELF中,您可以将-export-dynamic
选项传递给编译器驱动程序-rdynamic
上的链接器(gcc
),以便将可执行文件中的符号导出到共享对象。
您的库中有一个虚拟print
实现,它将被可执行文件的实现所遮蔽,因为通常在共享对象之前搜索可执行文件以进行符号解析。
这样做的缺点是它不是很精细,你最终可能会覆盖一些你不想要的符号。更细粒度的选项是创建要导出的符号列表:
{
print;
<other symbols>
};
并将该列表传递给链接器,例如来自gcc:-Wl,--dynamic-list=<file with list of symbols>
答案 1 :(得分:4)
实现这一目标的一种更简单的方法是让可执行文件注册一个函数供库稍后使用,库存储一个指向该函数的指针,并可以在以后调用它。