如何解决未解决的符号?

时间:2011-04-13 12:15:36

标签: c++ dynamic-linking

问候。

我在将lib与我的程序动态链接时出现问题。 这是正在发生的事情:我正在开发模块化程序并测试模块系统。问题是我的模块使用了一些在主二进制文件中定义的类:一些抽象类,它们不会导致任何问题,还有一个非常具体的类,它无法解析。

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

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

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

我一直在寻找,从昨天开始向朋友询问,但似乎没有人知道如何解决这类问题。

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

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

然后我用这一行来制作库:

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

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

1 个答案:

答案 0 :(得分:0)

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