warning C4251编译警告解决办法

在使用MFC开发DLL时,如果我们导出的类中使用了像CString、string类等模板类的话,就会提示4251的编译警告:

warning: C4251:class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“xxx”的客户端使用

该警告可以用两种方法来消除。

1.将工程的MFC使用改为“在共享dll中使用mfc”,编译时就没有了4251的警告信息。

2.如果项目只允许使用“在静态库中使用mfc”,那就在工程中添加以下两个语句:

template class _declspec(dllexport)CStringT<char,StrTraitMFC< char >>;

template class _declspec(dllexport)CStringT<TCHAR, StrTraitMFC< TCHAR >>;

template class __declspec(dllexport)std::allocator<char>;

class __declspec(dllexport) std::_String_base;

template class __declspec(dllexport) std::_String_val<char,std::allocator<char>>;

template class __declspec(dllexport) basic_string<char, char_traits<char>, std::allocator<char>>;

template class __declspec(dllexport)std::allocator<myStruct>;

template class __declspec(dllexport)std::vector<myStruct, std::allocator<myStruct> >;

1. 情况1

如果类的定义里面仅含有编译器内置的类型变量int, float等等,或者成员函数仅使用了这些变量作为参数,那么很简单,直接将类导出就可以了。

class__declspec(dllexport) YourClass

{

}

2. 情况2

如果类内部使用了别的类,那么别的类最好也导出,不然,首先编译的时候会出现编译警告:

warning C4251: needs to havedll-interface

意思是你使用另外的一些类型/接口,但是这些类型或接口没有导出。当你的client使用这些类型/接口的时候,会出错。

class__declspec(dllexport) YourClass

{

YourAnatherClass m_data;  // 这里会出现warning 4251

}

解决办法就是: 在YourAnatherClass定义的地方加上

class__declspec(dllexport) YourAnatherClass

{

}

如上,当你的YourAnatherClass没有导出的时候,dll的使用方会出现链接错误。

3.情况3

当类的内部使用了STL模板的时候,也会出现C4251警告,情况会有所不同

class__declspec(dllexport) YourClass

{

vector<int> m_data; // 这里会 出现 warning 4251. 因为vector<int>类型没有被导出

}

上面的使用模板(无论是stl模板,还是自定义模板)的代码,编译dll时会出现C4251警告,但是dll的使用方,却不会出现链接错误。这个因为dll的使用方那里也有一套模板的定义,当他们使用那个vector<int>的时候,虽没有导出,但是用户自己也有一套STL模板(或者是自定义的模板),用户会利用自己的模板实例化这个dll中没有导出的东西。所以,对于因为使用STL(或模板)出现的c4251警告,关闭之即可。

#pragma warning(push)

#pragma warning(disable:4251)

//your declarations that cause 4251

#pragma warning(pop)

若想不使用通过关闭警告的方式关闭警告,那么就这样

1)对于用户自定义的模板

template class DLLImportExportMacro SomeTemplate<int>;

SomeTemplate<int> y;

2)对于STL的模板

templateclass DLLImportExportMacro std::allocator<int>

templateclass DLLImportExportMacro std::vector<int,

std::allocator<int>>;

vector<int> m_data;

导出一个类到DLL,其中用到STL,比如 vector < int >

就会有警告:

C4251warning when using stl-classes in the dll-interface

原因是因为STL的类并没有导出。可能出现的问题比如在一个导出类Y中用到一个非导出类X,那么在Y的一个内联函数y_f 可能调用了 X的x_f同样内联的函数;如果不是静态链接X,就会链接失败,因为找不到x_f。

warning C4251编译警告解决办法相关推荐

  1. IMP-00041: 警告: 创建的对象带有编译警告解决办法

    出现IMP-00041: 警告: 创建的对象带有编译警告: 以后再做数据迁移的时候需要额外注意,尤其用户中有视图或者触发器对象的时候. 用户的环境是这样的,在库里有三个oracle的用户,其中一个用户 ...

  2. Matlab7.0安装之后Runtime Error警告解决办法

    Matlab7.0安装之后Runtime Error警告解决办法 | 浏览:35 | 更新:2014-04-11 23:58 1 2 3 4 5 分步阅读 matlab是一款大型矩阵实验室,对于工科学 ...

  3. Arduino编译错误解决办法:fork/exec:…\arm-none-eabi-g++.exe: The filename or extension is too long

    编译错误解决办法:fork/exec:-\arm-none-eabi-g++.exe: The filename or extension is too long 解决方案来自Edge Impulse ...

  4. win10系统打开文件安装软件总是弹出安全警告解决办法

    描述:win10系统打开文件安装软件总是弹出安全警告解决办法 步骤: win键+R,输入gpedit.msc 点击用户配置->管理模板->windows组件->附件管理器文件夹 找到 ...

  5. 使用Crypto++库编译出错 解决办法

    错误信息: 1 1>------ 已启动生成: 项目: testCrypto++, 配置: Debug Win32 ------ 2 1>正在编译... 3 1>main.cpp 4 ...

  6. 关于ucos主函数调用OSTaskCreate创建用户的警告解决办法

    1/所存在的问题描述, 在工程main.c编译时,keilMDK报出警告具体如下, warning:  #167-D: argument of type "void (*)(void)&qu ...

  7. Android项目出现main.xml编译出错和 出现main.out.xml无法编译的解决办法

    由于Eclipse的原因 当run时处于xml文件的情况下 会出现这个问题 解决办法是: 1首先把自动生成的空文件main.out.xml删除 然后项目会出错 这时候选择Project--Clean ...

  8. Maven常见警告解决办法

    1.Duplicating managed version 2.9.0 for jedis 原因:重复管理某个jar包的版本,一般出现在父类pom有<dependencyManagement&g ...

  9. IIS+php环境下:上传文件出现:windows server PHP Warning: mkdir(): Permission denied 解决办法

    PHP Warning: mkdir(): Permission denied:解决办法 最近买个了腾讯云服务器(windows server 2012 r2)配置了个iis+php+mysql的网站 ...

最新文章

  1. Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
  2. [20190805]在小程序中使用npm包
  3. PHP MySQL学生宿舍管理系统源代码_php高校学生宿舍管理系统
  4. 拉格朗日中值定理ξ怎么求_微分学核心定理——中值定理
  5. @JsonIgnore和@JsonSerialize 的 区别
  6. 微信端打开页面,布局乱了
  7. AI,机器学习(模式识别),深度学习的区别与联系
  8. 现在国内程序员的工资是什么行情?
  9. 2022年餐具行业市场分析
  10. SDOI2015 寻宝游戏
  11. https证书异常是什么意思?
  12. Mac 配置Git与常用命令
  13. The Softer Side of the Architect
  14. reack Hooks
  15. Word中Mathtype公式编辑无法打空格解决
  16. CCleaner软件清理系统注册表技巧
  17. C语言判断三条边是否能组成三角形
  18. 婚恋职场人格-张晓文-武汉理工大学-中国MOOC-人格知识大比武测试题参考答案
  19. 运放减法器公式推导过程-运算放大器
  20. spark运行自带例子_运行spark自带的例子出错及解决

热门文章

  1. islider.js轮播图
  2. Android中对已安装应用的管理实现
  3. 高性能ORM 框架之 MySqlSugar
  4. 【开源】多多客发布 3.0.0-alpha.6,Koa+Vue+Taro最佳实践
  5. 正则中关于环视(lookaround)的小例子
  6. 如何使用@vue/cli 3.0在npm上创建,发布和使用你自己的Vue.js组件库
  7. dubbo之rmi协议使用
  8. Using Java SecurityManager to grant/deny access to system functions
  9. Android 性能优化方法
  10. innodb的锁时间