Я преобразовываю основанную на ATL статическую библиотеку в DLL и получаю соблюдающее предупреждение на любых экспортируемых классах, которые используют ATL CString
класс (найденный в atlstr.h):
предупреждение C4251: 'Нечто:: ул. _': класс 'ATL:: 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.
вот нить с хорошим обсуждением этого.
Короче говоря, компилятор предупреждает о том, что, по сути, ваш экспортируемый класс не отделяет интерфейс от реализации. Если ученики участников недоступны для клиентов, делают их частным и #PRAGMA
Предупреждение для этого члена / класса. Если члены доступны и используются клиентами, вам нужно будет предоставить косвенный доступ к участникам посредством доступа и мутаторов.
Я обычно получаю это предупреждение, когда я делаю глупую ошибку в создании DLL с библиотекой Runtime One / MultiSticleded вместо односпальной / многопотативной обработки. Возможно, вы захотите проверить это в ваших настройках проекта.