无法引用另一个插件中的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法引用另一个插件中的方法相关的知识,希望对你有一定的参考价值。

我在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

任何指导都非常感谢。

  • QT:4.8
  • IDE:QT创建者4.4.0
  • 操作系统:Windows 10
答案

如果插件是独立的,则无法直接调用它们之间的函数。在这种情况下,如果您确实需要跨插件调用函数,则需要使用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;

以上是关于无法引用另一个插件中的方法的主要内容,如果未能解决你的问题,请参考以下文章

无法对非静态方法 getAssets() 进行静态引用 - 无法在片段中播放音频

Java - 为啥另一个包中的子级无法通过父级引用访问父级的受保护方法?

片段中的 super.onCreateView

无法从片段中的 SQLite 获取数据

从另一个片段调用一个片段中的方法

从另一个活动的活动中的片段传递数据