我在classA
中有PluginA
中的方法,我能够在同一个插件中的所有类中编译和访问此方法。当我尝试从另一个pluginB
访问该方法时,我得到以下错误。虽然我可以从pluginA
中引用和打印pluginB
中的枚举。
\plugins\pluginB\mocks\classB.cpp:61: error: undefined reference to namespaceA::classA::methodA(int)
collect2.exe:-1: error: error: ld returned 1 exit status
任何指导都非常感谢。
如果插件是独立的,则无法直接调用它们之间的函数。在这种情况下,如果您确实需要跨插件调用函数,则需要使用GetProcAddress
来检索特定函数的地址。但是这仅适用于使用extern "C"
声明的自由函数:
// Somewher in pluginA
extern "C" void functionA() {}
// Somewhere in pluginB
using MyFunc = void(void);
MyFunc *pointer = GetProcAddress(module,TEXT("functionA"));
if (pointer)
pointer(); // call "functionA()";
else
qWarning("functionA() not found, pluginA not loaded");
请注意,您可能希望使用EnumProcessModulesEx()
搜索所有可能加载的module
。
如果pluginB在编译时链接到pluginA,那意味着你应该在pluginB的.pro文件中有LIBS += -lpluginA
。还要确保你在__declspec( dllexport )
声明中使用__declspec( dllimport )
和classA
。
如果您使用Qt Creator向导生成pluginA项目,那么您的代码中应该已经有类似的内容:
#ifdef _MSC_VER
#if defined(LIBRARY_A)
#define LIBRARY_A_EXPORT __declspec(dllexport)
#else
#define LIBRARY_A_EXPORT __declspec(dllimport)
#endif
#else
#define LIBRARY_A_EXPORT
#endif
只需确保classA定义如下:class LIBRARY_A_EXPORT classA
;