如何从我的库中调用可执行文件中的函数?

我有一个可执行文件和一个dynamic库(.so)。 库导出一些符号和可执行调用成功。 但是我想让库调用可执行文件的function。 我试图做可执行文件中的以下内容:

//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选项传递给链接器(编译器驱动程序gcc上的gcc ),以便将可执行文件中的符号导出到共享对象。

您的库中会有一个虚拟print实现,这将会被执行文件的实现所遮蔽,因为可执行文件通常会在共享对象之前search以进行符号parsing。

这有一个缺点,它不是很细致,最终可能会压倒你不想要的符号。 更细粒度的选项将创build一个要导出的符号列表:

 { print; <other symbols> }; 

并将该列表传递给链接器,例如从gcc: -Wl,--dynamic-list=<file with list of symbols>

一个更简单的方法是让可执行程序注册一个函数供库以后使用,函数库存储一个指向函数的指针,并可以在稍后调用它。