2011-06-09 59 views
8

我有一个可执行文件和一个动态库(.so)。该库导出一些符号和可执行调用成功。但我想让库调用可执行文件的功能。我一直试图做的可执行如下:如何从我的库中调用可执行文件中的函数?

//test 
extern "C" void print(const char * str) { 
    std::cout << str << std::endl; 
} 

,这在库:

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

,但是当我在执行调用dlopen(加载库),它会返回错误undefined symbol: print。我该如何解决它?

回答

9

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

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

这有缺点,它不是非常细粒度,你可能会最终覆盖一些你不打算的符号。该细粒度选项是创建符号的列表导出为:

{ 
    print; 
    <other symbols> 
}; 

并传递给上述连接基团,例如来自gcc:-Wl,--dynamic-list=<file with list of symbols>

+0

@milo:我已经添加了从可执行文件导出符号的更加细致的方式。 – ninjalj 2011-06-10 19:36:30

+0

非常感谢!我想我最好读一下“dso howto”,以便在共享对象中获得更全面的知识。 – milo 2011-06-11 06:14:48

+0

对其他主要平台的几句话会很好。 – ManuelSchneid3r 2017-01-10 21:40:20

4

实现此目的的一种更简单的方法是让可执行文件注册一个函数供库以后使用,函数库存储指向该函数的指针,并可以在以后调用它。

相关问题