我使用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 的简洁实例功能。
答案 0 :(得分:0)
您可以使用在插件和主程序之间共享的常用函数创建一个dll,并将其链接到主程序和插件中。
答案 1 :(得分:0)
QPluginLoader 解决了我所描述的问题:通过 QPluginLoader 动态加载到主程序中的库将能够调用主程序中的函数。
我的问题的原因是我使用的插件界面中的一个微妙错误。
答案 2 :(得分:0)
有可能,但不要忘记在Linux上将主程序与-rdynamic
标志链接起来,以便从插件中看到主程序的符号。