代码之家  ›  专栏  ›  技术社区  ›  Rob

生成导出包含atl::cstring成员的类的dll时出现警告C4251

  •  17
  • Rob  · 技术社区  · 15 年前

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

    警告C4251:“foo::str_uu”:类 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 回复  |  直到 7 年前
        1
  •  17
  •   UmNyobe    10 年前

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

    [此警告]在使用时发出 中的非dllexported类x D报告了Y类。怎么了? 关于那个?好吧,假设你有 调用 属于x的函数x_f,即 也不是内联的。如果y_f是内联的 在某个没有 静态链接X,链接将失败, 因为找不到X。

        3
  •  5
  •   Community CDub    8 年前

    Here is a thread 好好讨论一下。

    简而言之,编译器警告您,实际上,导出的类不会将接口与实现分离。如果客户无法访问相关成员,则将其设为私有,并且 #pragma 取消对该成员/类的警告。如果成员可以被客户机访问和使用,那么您将需要通过访问器和转换器提供对成员的间接访问。

        4
  •  0
  •   William Knight    15 年前

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