从动态加载的库(QPluginLoader)

时间:2015-05-25 14:47:27

标签: c++ qt dllimport symbols

我使用Qt QPluginLoader 类在运行时动态加载插件(DLL)。

到目前为止,我已经成功加载了具有从主程序调用的函数的插件。现在,插件需要调用主程序中的其他函数。我在插件项目中包含了相关的头文件,并且编译时没有错误。

当我尝试从主程序调用以下插件函数时:

// main program calling a function in a dll that has been dynamically
// loaded into the program:
PluginInterface* plugin = qobject_cast<PluginInterface*>(QPluginLoader(path)).instance();
plugin->DoSomething(); // works, writes a message to the console
plugin->callMainProgramFunction(); // not working

&#39;

// test method in the plugin project (dll) that writes to console:
void TestDLL::DoSomething();
{
   std::cout << "Hello, this messages comes from TestDLL! Have a nice day"; // works
}

&#39;

// test method in the plugin project (dll) that tries to 
// call a method in the main program: 
void TestDLL::callMainProgramFunction()
{  
    Angle test; // angle.h is included, and offers geometric functions
    std::cout << test.sine() << "\n"; // does not work, program stops
}

程序停止。我相信这是因为插件不知道在哪里找到符号(来自 angle.cpp 的代码链接并编译到主程序中),因为它之后动态链接到程序中。

许多插件将使用相同的功能,因此我认为编译每个插件时所有实现都是个坏主意。

是否有解决方案,使用 QPluginLoader ?如何告诉动态加载的插件在主程序中找到符号的位置?我知道 QLibrary 提供了一种更加手动的导出/导入功能和解决符号的方法,但缺少 QPluginLoader 的简洁实例功能。

3 个答案:

答案 0 :(得分:0)

您可以使用在插件和主程序之间共享的常用函数创建一个dll,并将其链接到主程序和插件中。

答案 1 :(得分:0)

QPluginLoader 解决了我所描述的问题:通过 QPluginLoader 动态加载到主程序中的库将能够调用主程序中的函数。

我的问题的原因是我使用的插件界面中的一个微妙错误。

答案 2 :(得分:0)

有可能,但不要忘记在Linux上将主程序与-rdynamic标志链接起来,以便从插件中看到主程序的符号。