Экспорт глобальных переменных из DLL
Я пытаюсь экспортировать глобальную переменную из DLL.
foo.h
class Foo
{
public:
Foo()
{}
};
#ifdef PROJECT_EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif
API const Foo foo;
foo.cpp
#include "Foo.h"
const Foo foo;
Когда я компилирую вышеуказанный код, Visual Studio жалуется:
foo.cpp(3): ошибка C2370: 'foo': redefinition; различный класс хранения
1 > foo.h(14): см. Объявление 'foo'
Если я использую:
external const Foo foo;
в Foo.h компилятор счастлив, но тогда DLL не экспортирует символ. Мне удалось экспортировать функции с проблемами, но переменные, похоже, не работают одинаково... Любые идеи?
Ответы
Ответ 1
В заголовке:
API extern const Foo foo;
В исходном файле:
API const Foo foo;
Если у вас нет ключевого слова extern
, ваш компилятор C предполагает, что вы хотите объявить локальную переменную. (Не важно, чтобы вы включили определение из файла заголовка.) Также вам нужно сообщить компилятору, что вы планируете экспортировать переменную, когда вы действительно объявляете ее в своем исходном файле.
Ответ 2
Класс Foo
скорее всего, в действительности будет иметь функции-члены, вызов их из другого модуля вызовет ошибки компоновщика с ответом OP/accept. Класс также должен быть определен как dll export/import, чтобы использовать его экспортированный экземпляр вне этого модуля для устранения ошибок ссылки.
class API Foo
{
public:
Foo()
{}
void DoSomeWork(); // calling this would cause link error if Foo is not defined as import/export class
};
С учетом вышесказанного, может быть, лучше переименовать API-интерфейс #define
нечто вроде DLLEXPORT, чтобы иметь смысл как для API, так и для класса экспорта.