c++ - 使用 C++ 的动态链接问题

标签 c++ linux shared-libraries

运行整个过程会出现以下错误:

Cannot open library "./libexamplefilter.so" ./libexamplefilter.so: undefined symbol: _ZTI10BaseFilter

由于代码非常小且易于理解,您应该能够立即理解它。 有人知道哪里出了问题吗?

我是否应该将 create() 声明为 extern "C"void* create(void); 然后转换 void 指针而不是直接尝试链接 C++ 符号?

下一步

使用 -Wl,-export-dynamic 后,它告诉我:

Cannot load library symbols "./libexamplefilter.so" ./libexamplefilter.so: undefined symbol: create

呃,我是否必须在那里给出一个损坏的 c++ 名称,而不是“dlsym(handle, “create”)”。大概。有没有优雅的方式来做到这一点?

答案是声明 create() extern "C"... create .... 这非常有效。 问题解决了。感谢您的帮助和耐心等待。

最佳答案

编译主可执行文件时需要使用链接器选项“export-dynamic”。

通常,主可执行文件不会导出它的符号供动态链接器使用(除非该符号被一些参与链接的共享库使用),这意味着如果你的库回调主 exe,它将无法加载。

当您尝试使用虚方法子类化类时以及在其他一些情况下,这会隐式发生。如果您尝试这样做,那就失败了。

所以当链接你的主程序时,添加-Wl,-export-dynamic,它就会正常工作。

关于c++ - 使用 C++ 的动态链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1500689/

相关文章:

linux - 将大文件加载到 Amazon S3

php - ZF2 : Fatal error: Using $this when not in object context in linux platform

linux - 与共享对象链接时 undefined reference

c++ - 可能的编译器错误?使用从模板化静态成员函数检索的指针调用模板化方法时,无法进行自动推导

c++ - 临时延长生命周期

javascript - 如何根据操作系统调整 html 输出?

ios - 链接共享库时选项 -fembed-bitcode 消失

c++ - 将节点添加到 LinkedList 不是永久 C++

C++通过函数初始化类指针

c - 将遗留 C 代码(与全局变量的广泛使用紧密结合)重构为共享库