23

我正在将基于 ATL 的静态库转换为 DLL,并在任何使用 ATLCString类(在 atlstr.h 中找到)的导出类上收到以下警告:

警告 C4251: 'Foo::str_' : 类 '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。

4

4 回答 4

19

这个线程给出了我认为更好的答案,Doug Harrison(VC++ MVP):

[此警告] 当您在 dllexported 类 Y 中使用非 dllexported 类 X 时发出。这有什么不好?好吧,假设 Y 有一个内联函数 y_f,它调用一个属于 X 的函数 x_f,该函数也不是内联的。如果 y_f 内联在某个不静态链接 X 的客户端中,则链接将失败,因为找不到 x_f。

于 2010-12-30T15:10:18.753 回答
14

这个微软页面帮助了我。

如何导出标准模板库 (STL) 类和包含作为 STL 对象的数据成员的类的实例化

于 2011-04-05T07:43:02.140 回答
9

这是一个很好的讨论的线程。

简而言之,编译器警告您,实际上,您导出的类没有将接口与实现分开。如果客户无法访问有问题的成员,请将它们设为私有并#pragma消除该成员/类的警告。如果成员可以被客户端访问和使用,那么您将需要通过访问器和修改器提供对成员的间接访问。

于 2010-01-25T14:10:25.537 回答
0

当我犯了使用运行时库单/多线程而不是单/多线程 DLL 构建 DLL 的愚蠢错误时,我通常会收到此警告。您可能想在您的项目设置中进行检查。

于 2010-01-29T00:11:17.617 回答