c++ - 如何解析未解析的符号?

标签 c++ dynamic-linking

问候。

我在将我的库动态链接到我的程序时遇到问题。 这是正在发生的事情:我正在开发一个模块化程序并测试模块系统。问题是我的模块使用了一些在主二进制文件中定义的类:一些不会引起任何问题的抽象类,以及一个无法解析的非常具体的类。

我正在使用 dlopen/dlsym/dlclose 函数集。 我使用 g++ 进行编译。

问题是:如果我要求 dlopen 加载所有符号,那么它不会告诉我 "undefined symbol: _ZNK3zia3api8DataTreecvRKSsEv 但是,如果我以惰性模式启动 dlopen,它只会在第一次使用所谓的类时发生(并在之后立即崩溃)。

所以这是“DataTree”类,我想让它可用于主二进制文件和模块。 我已经尝试在每个二进制文件中编译它:如我所料,它没有用。 我也试图让它完全内联,但它和我的其他尝试一样无用。 我尝试使用“-rdynamic”选项编译主二进制文件。没有变化。

从昨天开始就一直在找,问 friend ,但是好像没人知道怎么解决这种问题。

我使用选项 -fPIC 编译模块的对象,如下所示:

g++ -Wall -fPIC -c mysource.cpp

然后我使用这一行来创建库:

g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so mysource.o

我认为最好的解决方案是不在库中编译对象,而是让符号在主二进制文件中可用。 那么问题是:怎么做? (这是我必须做的吗?)

最佳答案

尝试将 -rdynamic 添加到库模块而不是主程序,并确保所有具有虚方法并被继承的类都具有虚析构函数。另一个建议:做一个最小的例子并张贴在这里。

关于c++ - 如何解析未解析的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5649015/

相关文章:

c++ - 如何在 QTableWidget : Qt5 中鼠标悬停时突出显示整行

linux - Caffe 安装,链接问题

c++ - C 编译的 .so 可以与 C++ 应用程序一起使用吗?

c++ - 从 C++ 类制作 Visual C++ DLL

c++ - 交叉编译 GCC : Link tests are not allowed after GCC_NO_EXECUTABLES when checking dynamic linker characteristics

c++ - 从 int 转换为 bool 时出错

c++ - 具有 k = 2 的 knnMatch 返回 0 最近邻,即使图像经过训练

c - 共享图片库中的全局变量在32位和64位二进制中有不同的访问方式,以及它的位置?

c++ - 静态链接的boost库的动态链接错误

c++ - alListener3f(AL_ORIENTATION, 0, 0, -1) 之后的 OpenAL AL_ILLEGAL_ENUM