2014-11-19 6 views
0

Я хочу написать плагин для приложения. Приложение приносит заголовок и c-файл плагина, написанные с экспортированными функциями для заполнения. Чтобы упростить разработку, я хочу создать C++ «api». Для этого я создал базовые классы с виртуальными функциями (абстрактные абстрактные функции) и вызывать эти функции из c-файла плагина. Это «api» должно быть в файле статической библиотеки.Функция экспорта совместно используемой библиотеки C++

Настоящий плагин (общая библиотека) должен включать эту статическую библиотеку, выводить и реализовывать необходимые классы.

Теперь моя проблема: как я могу экспортировать функцию из включенной static lib в общую библиотеку lib (поэтому приложение вызывает функции из статической библиотеки lib)? Это возможно?

ответ

1

Обычно, если вы хотите иметь механизм плагинов с C++, то это самый распространенный способ сделать это:

// Plugin file 
extern "C" BaseClass* create() 
{ 
    return new DerivedClass; 
} 

extern "C" void destroy(BaseClass* base) 
{ 
    delete base; 
} 

Затем в коде, который использует плагин вы на самом деле дело с BaseClass без заботясь о том, что именно DerivedClass в настоящее время указывается. Итак, методы, которые вам нужно экспортировать из плагина, нужно поместить в BaseClass и сделать их виртуальными.

Note1: Убедитесь, что вы всегда вызывать destroy функцию вместо прежде всего с использованием delete, как это может быть перегружен в вашем приложении, но не в библиотеке плагинов, или наоборот.

Note2: Не забудьте сделать деструктор вашего базового класса виртуальным.

Note3: Вы должны быть очень осторожны при использовании C++ API с динамическими библиотеками загрузки. Проблема заключается в том, что компилятор управляет именами классов и функций C++. Поэтому, если вам удастся скомпилировать приложение и библиотеку плагинов с разными компиляторами или даже с разными версиями одного и того же компилятора, то компоновщик может оказаться не в состоянии правильно определить имя функции, чтобы найти его в библиотеке плагина.

Note4: Эта же проблема выше может произойти, если вы внесете некоторые изменения в приложение, тем самым сделав компилятор для изменения имени для существующих функций. Пожалуйста, смотрите here для получения дополнительной информации.

Смежные вопросы