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

我有一个可执行文件和一个动态库(.so)。该库会导出一些符号,并且可执行文件会成功调用它。但是我想使库调用可执行文件的功能成为可能。我试图在可执行文件中执行以下操作:

//test

extern "C" void print(const char * str) {

std::cout << str << std::endl;

}

和这个在图书馆:

extern "C" void print(const char *);

但是当我调用dlopen可执行文件(以加载库)时,它返回error undefined symbol: print。我该如何解决?

回答:

在Linux / ELF中,您可以将-export-

dynamic选项传递给链接器(-rdynamic在编译器驱动程序上gcc),以便将可执行文件中的符号导出到共享库中。

print的库中会有一个虚拟实现,该实现会被可执行文件上的实现所遮盖,因为通常在共享对象之前搜索可执行文件以进行符号解析。

这样做的缺点是,它的粒度不是很精细,最终可能会覆盖一些您不希望使用的符号。更精细的选项是创建要导出为的符号列表:

{

print;

<other symbols>

};

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

以上是 如何从我的库中调用可执行文件中的函数? 的全部内容, 来源链接: utcz.com/qa/407889.html

回到顶部