Невозможно сослаться на методы в другом плагине - PullRequest
0 голосов
/ 03 января 2019

У меня есть метод в 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

1 Ответ

0 голосов
/ 03 января 2019

Если плагины независимы, вы не можете напрямую вызывать функции через них. В этом случае, если вам нужно вызвать функцию через плагины, вам нужно использовать 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.

Если плагин B связан с плагином A во время компиляции, это означает, что у вас должно быть LIBS += -lpluginA в файле .pro вашего плагина B. Также убедитесь, что вы используете __declspec( dllexport ) и __declspec( dllimport ) в декларации classA.

Если вы использовали мастер Qt Creator для генерации проекта плагина A, у вас уже должно быть что-то подобное в вашем коде:

#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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...