我无法加载我的自定义插件库,该库链接到使用自定义命名空间构建的自定义共享Qt库,如果已经将任何系统范围的Qt库加载到该进程中。
换句话说,我有myplugin.so。它使用自定义Qt库中的一些符号,所有这些符号都与命名空间前缀(例如myNS)的各个原始Qt符号不同。 ldd on myplugin.so显示了libQtCore.so.4,因此它没有指定任何次要的Qt版本。
我使用空的控制台应用程序(没有链接到Qt)完成了一些测试。
一个。通常的插件加载
dlopen("myplugin.so", RTLD_NOW); // returns a non-null pointer, the plugin was loaded OK
B中。尝试使用预先加载的系统范围的QtCore库加载插件
dlopen("/usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7", RTLD_NOW); // returns a non-null pointer
dlopen("myplugin.so", RTLD_NOW); // returns a null pointer, the plugin was not loaded
dlerror给出了
未定义的符号:_ZN4myNS7QObject16staticMetaObjectE
℃。尝试通过预加载自定义QtCore库来解决测试B
dlopen("/usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7", RTLD_NOW); // returns a non-null pointer
dlopen("libQtCore.so.4.8.6", RTLD_NOW); // custom qt library, a non-null pointer returned
dlopen("myplugin.so", RTLD_NOW); // returns a null pointer, the plugin was not loaded
dlerror产生相同的输出。
d。反转加载QtCore库的顺序有帮助
dlopen("libQtCore.so.4.8.6", RTLD_NOW); // custom qt library, a non-null pointer returned
dlopen("/usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.7", RTLD_NOW); // returns a non-null pointer
dlopen("myplugin.so", RTLD_NOW); // returns a non-null pointer, the plugin was loaded OK
根据测试C的结果,加载器尝试从第一个加载的库中解析符号,并且即使已经加载好,也会忽略另一个符号。
我做错了什么?我尝试过标记RTLD_NOW,RTLD_LAZY,RTLD_LOCAL,RTLD_GLOBAL的不同组合,但它们没有帮助。
我的任务是加载插件库,而不管其他加载的Qt库。