Экспорт глобальных переменных из DLL - PullRequest
20 голосов
/ 23 июня 2010

Я пытаюсь экспортировать глобальную переменную из 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»: переопределение;другой класс хранения 1> foo.h (14): см. объявление 'foo'

Если я использую:

external const Foo foo;

в Foo.h, компилятор доволен, но тогда DLL делаетне экспортировать символ.Мне удалось экспортировать функции с проблемами, но переменные, похоже, не работают одинаково ... Есть идеи?

Ответы [ 2 ]

28 голосов
/ 23 июня 2010

В вашем заголовке:

API extern const Foo foo;

В исходном файле:

API const Foo foo;

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

1 голос
/ 05 октября 2017

Класс Foo, скорее всего, в действительности будет иметь функции-члены, вызов их из другого модуля вызовет ошибки компоновщика с OP / принятый ответ.Класс также должен быть определен как dll export / import для того, чтобы использовать его экспортированный экземпляр вне этого модуля для устранения ошибок ссылки.1005 * API с чем-то вроде DLLEXPORT, так что это имеет смысл как для API, так и для класса экспорта.

...