C/C++ warning C4251: class ... 需要有 dll 接口由 class“..” 的客户端使用
{
在DLL编程中, 如果调用模版类, 则可能出现类似以下的错误:
1>xclock.h(29): warning C4251: “XClock::m_FileName”: class“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”需要有 dll 接口由 class“XClock”的客户端使用
1>xstring(2633): note: 参见“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”的声明
1>xclock.h(30): warning C4251: “XClock::m_Stage”: class“std::queue<std::string,std::deque<_Ty,std::allocator<_Ty>>>”需要有 dll 接口由 class“XClock”的客户端使用
1> with
1> [
1> _Ty=std::string
1> ]
模板类在绝大多数的编译器里要求实现一起提供,因此不能放在dll中
Solution:
第一种: 无视它或者#pragma warnind( disable: 4251 )
第二种:将该数据改为指针方式:
class __declspec( dllexport ) Test
{
public:
std::vector<int>* m_objCon;
};
然后在构造函数和析构函数中分别初始化和释放它。
第三种:
将该模板类及其依赖类导出。
#include <iostream>
#include <vector>
using namespace std;
class __declspec( dllexport ) Test
{
public:
template class __declspec( dllexport ) std::allocator<int>;
template class __declspec( dllexport ) std::vector<int, std::allocator<int> >;
public:
std::vector<int> m_objCon;
};
int main()
{
return 0;
}
这 种方法要注意的是必须要把要导出模板类的模板数据成员一并导出。有点类似于显式实例化。比如说你要导出boost::shared_ptr就还必须将其依 赖的shared_count一并导出。导出map还需要导出对应pair等等。很麻烦啦~所以我们还是选择第四种吧。
第四种:Impl。
#include <iostream>
#include <vector>
using namespace std;
// 这些放到.h中
class Test_imp;
class __declspec( dllexport ) Test
{
// 构造函数中初始化 析构中释放m_pImp;
void test();
public:
Test_imp* m_pImp;
};
// 这个类放到cpp中去
class Test_imp
{
public:
void test(){}
std::vector<int> m_objCon;
};
// 放到cpp中
void Test::test()
{
m_pImp->test();
}
}
C/C++ warning C4251: class ... 需要有 dll 接口由 class“..” 的客户端使用的更多相关文章
- (转)如何解决VC中的警告warning C4251 needs to have dll-interface
这通常是由于以数据成员方式在DLL导出类中使用了模板类造成的.比如: #include <iostream> #include <vector> using namespace ...
- C++学习 | C++ Implement的使用 | 消除 warning C4251 | 精简库接口
在编写C++动态库的过程中,我们常常会听到某个要求:请隐藏动态库头文件里类接口里的成员变量!或者自己在编写动态库时,突然意识到自己好像让调用者看到的信息太多了,而这些信息根本无需被调用者看到,往往 ...
- DLL接口自动化测试总结
1. DLL接口测试方法介绍 在最近测试的项目中,系统给业务端提供DLL文件,业务端通过DLL文件中的C++接口实现系统功能,这就需要对DLL中的C++接口进行详细功能测试. 本文主要介绍项目测试中使 ...
- c#调用dll接口传递utf-8字串方法
1. 起源: VCU10之视频下载模块,采用纯python编码实现,c++代码调用pythonrun.h配置python运行环境启动python模块,编译为dll给c#调用,以使界面UI能够使用其中功 ...
- DLL接口的实现(虚函数)
DLL接口的实现(虚函数) 我们在c++编程过程中往往要用到各种不同形式的程序库,这些库的发布方式有动态库和静态库.对于静态类库,设计良好的静态类库能实现功能上的隔离,无法避免类库实现必须重新编译.链 ...
- ASP.NET使用WebApi接口实现与Android客户端的交互(图片或字符串的接收与回传)
最近在使用WebApi 做下记录 //此接口实现接收Android客户端上传的JSON格式的信息,并返回"nihao"字符串 [Route("ReceiveData& ...
- Visual Studio 2010/2013 查看DLL接口(函数)
1. “应用程序" Visual Studio 2010/2013 的Visual Studio Tools文件夹中打开Visual Studio Command Prompt 命令提示窗口 ...
- VS查看DLL接口
应用程序Microsoft Visual Studio 2010的Visual Studio Tools文件夹中打开Visual Studio Command Prompt (2010)命令窗口 du ...
- 使用WebService发布soap接口,并实现客户端的https验证
什么是https HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证. 如何进行身份验证? 首先我们要明白什么是对称 ...
随机推荐
- 前端学习(十八)js的json(笔记)
json: 数组: 1.有序 var arr=[2,1,3,4] arr[0]; 2.有length 3.普通for 4.下标数字 5.添加删除 splice json: ...
- mongodb的学习 (2)
1.条件查询 查询姓名为小明的学生 db.local.find({name:'小明'});; 查询英语成绩大于90分的同学 ...
- selenium基本元素定位-findElement(By.*)
selenium基本元素的定位和操作 一. 查找元素 1.1 findElement(By.id) // by——>定位器——>以某种方式去找元素 driver.findElement(b ...
- SQL 空值
SQL NULL Values(空值) 什么是SQL NULL值? SQL 中, NULL 用于表示缺失的值.数据表中的 NULL 值表示该值所处的字段为空. 具有NULL值的字段是没有值的字段. 如 ...
- 【Redis】分布式锁RedLock
普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...
- Yii2中GridView
Yii2 GridView与dropdownList结合的用法 http://www.yiichina.com/tutorial/473 <?=$form->field($model, ' ...
- html常用标签梳理
标签的语法 标签由英文尖括号<和>括起来,如<html>就是一个标签. html中的标签一般都是成对出现的,分开始标签和结束标签.结束标签比开始标签多了一个/. 如: (1)& ...
- 奇技淫巧之Delphi和JavaScript互通
http://www.raysoftware.cn/?p=305 Delphi2010以后增加了新的RTTI信息,也就是通过RTTI可以在运行时获取/调用对象的公开成员或者函数. ScriptCont ...
- 微信小程序无法获取到unionId(专业踩坑20年)
UnionID机制说明如果开发者拥有多个移动应用.网站应用.和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用.网站应用和公众帐号(包括小程 ...
- CentOS6.8搭建LNMP环境
selinux可能会致使编译安装失败,我们先禁用它.永久禁用,需要重启生效 sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/c ...