Подтвердить что ты не робот

Экспорт глобальных переменных из 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 не экспортирует символ. Мне удалось экспортировать функции с проблемами, но переменные, похоже, не работают одинаково... Любые идеи?

4b9b3361

Ответ 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, так и для класса экспорта.