- main.cpp <- 第 106 到 164 行调用 dlopen/dlsym/dlclose
- basefilter.hpp <- 裸抽象基类
- basefilter.cpp
- examplefilter.hpp <- 一个测试插件
- examplefilter.cpp
- everything <- 存储库
运行整个过程会出现以下错误:
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/