warning C4251编译警告解决办法
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编译警告解决办法相关推荐
- IMP-00041: 警告: 创建的对象带有编译警告解决办法
出现IMP-00041: 警告: 创建的对象带有编译警告: 以后再做数据迁移的时候需要额外注意,尤其用户中有视图或者触发器对象的时候. 用户的环境是这样的,在库里有三个oracle的用户,其中一个用户 ...
- Matlab7.0安装之后Runtime Error警告解决办法
Matlab7.0安装之后Runtime Error警告解决办法 | 浏览:35 | 更新:2014-04-11 23:58 1 2 3 4 5 分步阅读 matlab是一款大型矩阵实验室,对于工科学 ...
- 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 ...
- win10系统打开文件安装软件总是弹出安全警告解决办法
描述:win10系统打开文件安装软件总是弹出安全警告解决办法 步骤: win键+R,输入gpedit.msc 点击用户配置->管理模板->windows组件->附件管理器文件夹 找到 ...
- 使用Crypto++库编译出错 解决办法
错误信息: 1 1>------ 已启动生成: 项目: testCrypto++, 配置: Debug Win32 ------ 2 1>正在编译... 3 1>main.cpp 4 ...
- 关于ucos主函数调用OSTaskCreate创建用户的警告解决办法
1/所存在的问题描述, 在工程main.c编译时,keilMDK报出警告具体如下, warning: #167-D: argument of type "void (*)(void)&qu ...
- Android项目出现main.xml编译出错和 出现main.out.xml无法编译的解决办法
由于Eclipse的原因 当run时处于xml文件的情况下 会出现这个问题 解决办法是: 1首先把自动生成的空文件main.out.xml删除 然后项目会出错 这时候选择Project--Clean ...
- Maven常见警告解决办法
1.Duplicating managed version 2.9.0 for jedis 原因:重复管理某个jar包的版本,一般出现在父类pom有<dependencyManagement&g ...
- IIS+php环境下:上传文件出现:windows server PHP Warning: mkdir(): Permission denied 解决办法
PHP Warning: mkdir(): Permission denied:解决办法 最近买个了腾讯云服务器(windows server 2012 r2)配置了个iis+php+mysql的网站 ...
最新文章
- Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
- [20190805]在小程序中使用npm包
- PHP MySQL学生宿舍管理系统源代码_php高校学生宿舍管理系统
- 拉格朗日中值定理ξ怎么求_微分学核心定理——中值定理
- @JsonIgnore和@JsonSerialize 的 区别
- 微信端打开页面,布局乱了
- AI,机器学习(模式识别),深度学习的区别与联系
- 现在国内程序员的工资是什么行情?
- 2022年餐具行业市场分析
- SDOI2015 寻宝游戏
- https证书异常是什么意思?
- Mac 配置Git与常用命令
- The Softer Side of the Architect
- reack Hooks
- Word中Mathtype公式编辑无法打空格解决
- CCleaner软件清理系统注册表技巧
- C语言判断三条边是否能组成三角形
- 婚恋职场人格-张晓文-武汉理工大学-中国MOOC-人格知识大比武测试题参考答案
- 运放减法器公式推导过程-运算放大器
- spark运行自带例子_运行spark自带的例子出错及解决
热门文章
- islider.js轮播图
- Android中对已安装应用的管理实现
- 高性能ORM 框架之 MySqlSugar
- 【开源】多多客发布 3.0.0-alpha.6,Koa+Vue+Taro最佳实践
- 正则中关于环视(lookaround)的小例子
- 如何使用@vue/cli 3.0在npm上创建,发布和使用你自己的Vue.js组件库
- dubbo之rmi协议使用
- Using Java SecurityManager to grant/deny access to system functions
- Android 性能优化方法
- innodb的锁时间