在构建导出包含ATL :: CString成员的类的DLL时发出警告C4251

时间:2010-01-25 14:04:45

标签: c++ dll atl dllexport

我正在将基于ATL的静态库转换为DLL,并且在使用ATL CString类(在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 个答案:

答案 0 :(得分:17)

This thread给出了我认为更好的答案,Doug Harrison(VC ++ MVP):

  

使用时会发出[此警告]   a中的非dllexported类X.   dllexported class Y.什么是坏的   关于那个?好吧,假设Y有一个   调用a的内联函数y_f   函数x_f属于X   不是内联。如果y_f是内联的   在一些没有的客户内部   静态链接X,链接将失败,   因为找不到x_f。

答案 1 :(得分:12)

答案 2 :(得分:5)

Here is a thread对此进行了很好的讨论。

简而言之,编译器警告您,实际上,导出的类不会从实现中分离接口。如果客户端无法访问相关成员,请将其设为私有,并#pragma远离该成员/类的警告。如果成员可供客户端访问和使用,那么您将需要通过访问者和更改者提供对成员的间接访问。

答案 3 :(得分:0)

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