2011-04-13 141 views
1

问候。如何解决未解决的符号?

我有我的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

demangled name是zia :: api :: DataTree :: operator std :: string const&()const – 2011-04-13 12:34:59

+1

您可以使用'C++ filt'实用程序(在linux上)获取demangled名称。调用只是'C++ filt _ZNK3zia3api8DataTreecvRKSsEv',结果是@Industrial发布的内容。非常便利! – 2011-04-13 12:37:56

+0

好主!这确实是不确定的!我没有注意到它!非常感谢 ! – Michael 2011-04-13 12:44:00

回答

0

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

+0

导致它的类没有任何虚方法,除了它的析构函数。我也进行了双重检查:我已经使用了-rdynamic,并且现在在主二进制文件和库上执行它(以防万一)。仍然没有变化:/! – Michael 2011-04-13 12:38:53