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