如何从我的库中调用可执行文件中的函数?
我有一个可执行文件和一个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>
一个更简单的方法是让可执行程序注册一个函数供库以后使用,函数库存储一个指向函数的指针,并可以在稍后调用它。