Предупреждение C4251 при создании библиотеки DLL, которая экспортирует класс, содержащий член ATL :: CString - PullRequest
17 голосов
/ 25 января 2010

Я преобразую статическую библиотеку на основе ATL в DLL и получаю следующее предупреждение для всех экспортируемых классов, использующих класс ATL CString (находится в atlstr.h):

предупреждение C4251: 'Foo :: str_': class 'АТЛ :: CStringT' должен иметь dll-интерфейс для использования клиентами класса 'Foo'

Я правильно объявляю класс Foo как экспортированный через __declspec(dllexport). Это предупреждение, которое я могу игнорировать, или я делаю что-то не так? Настройки проекта DLL настроены для динамической связи с ATL, но, похоже, это не имеет значения.

Например:

#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif

// This class is exported from the DLLTest.dll
class DLLTEST_API Foo
{
public:
 Foo();
 CString str_; // WARNING C4251 HERE
};

Все клиенты этой DLL также будут использовать ATL.

Ответы [ 4 ]

17 голосов
/ 30 декабря 2010

Эта тема дает, как мне кажется, лучший ответ Дуга Харрисона (VC ++ MVP):

[Это предупреждение] выдается при использовании неэкспортированный класс X в dllexported класс Y. Что так плохо об этом? Ну, предположим, у Y есть встроенная функция y_f, которая вызывает функция x_f, принадлежащая X, то есть также не встроенный. Если y_f встроен внутри какого-то клиента, который не статически ссылка X, ссылка потерпит неудачу, потому что x_f не будет найден.

5 голосов
/ 25 января 2010

Вот тема с хорошим обсуждением этого.

Короче говоря, компилятор предупреждает вас, что ваш экспортированный класс, по сути, не отделяет интерфейс от реализации. Если рассматриваемые участники не доступны для клиентов, сделайте их личными и #pragma уберите предупреждение для этого члена / класса. Если участники доступны и используются клиентами, вам необходимо будет обеспечить косвенный доступ к членам через посредников и посредников.

0 голосов
/ 29 января 2010

Обычно я получаю это предупреждение, когда совершаю глупую ошибку, создавая DLL с библиотекой времени выполнения Single / Multithreaded вместо Single / MultithreadedDLL. Возможно, вы захотите проверить это в настройках вашего проекта.

...