如何解决VC中的警告warning C4251 needs to have dll-interface
2010-06-04 20:16
501 查看
原文地址:http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/a69368fa45782715a9d311c1.html
这通常是由于以数据成员方式在DLL导出类中使用了模板类造成的。比如:
#include <iostream>
#include <vector>
using namespace std;
class __declspec( dllexport ) Test
{
public:
std::vector<int> m_objCon;
};
int main()
{
return 0;
}
这会导致这个警告:
warning C4251: “Test::m_objCon”: class“std::vector<_Ty>”需要有 dll
接口由 class“Test”的客户端使用
1> with
1> [
1> _Ty=int
1> ]
这个问题主要要描述的是不同的地方的vector的实现可能不一样所造成的问题。所以我们应该将其导出。有很多方法可以解决这个问题的。
第一种: 无视它或者#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();
}
int main()
{
return 0;
}
个人推荐第二种和第四种,反对第一种。毕竟掩耳盗铃不是好习惯~~
第四种除了可以解决上面的问题之外还可以隐藏代码,当然多了一个桥接的过程。关于这个东西可以看看我08年的时候写的一篇垃圾文章,也许有帮助:这
里
那时候比现在还菜,所以乱七八糟的,凑合看看吧~
(比
如说导出类的时候每个函数都去加_declspec(dllexport),那是一个悲剧,不要学哦~)
这通常是由于以数据成员方式在DLL导出类中使用了模板类造成的。比如:
#include <iostream>
#include <vector>
using namespace std;
class __declspec( dllexport ) Test
{
public:
std::vector<int> m_objCon;
};
int main()
{
return 0;
}
这会导致这个警告:
warning C4251: “Test::m_objCon”: class“std::vector<_Ty>”需要有 dll
接口由 class“Test”的客户端使用
1> with
1> [
1> _Ty=int
1> ]
这个问题主要要描述的是不同的地方的vector的实现可能不一样所造成的问题。所以我们应该将其导出。有很多方法可以解决这个问题的。
第一种: 无视它或者#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();
}
int main()
{
return 0;
}
个人推荐第二种和第四种,反对第一种。毕竟掩耳盗铃不是好习惯~~
第四种除了可以解决上面的问题之外还可以隐藏代码,当然多了一个桥接的过程。关于这个东西可以看看我08年的时候写的一篇垃圾文章,也许有帮助:这
里
那时候比现在还菜,所以乱七八糟的,凑合看看吧~
(比
如说导出类的时候每个函数都去加_declspec(dllexport),那是一个悲剧,不要学哦~)
相关文章推荐
- 如何解决VC中的警告warning C4251 needs to have dll-interface
- warning C4251 needs to have dll-interface解决办法
- warning C4251 needs to have dll-interface解决办法
- warning C4251 needs to have dll-interface解决办法
- VS2005 warning C4251 needs to have dll-interface
- 去除Warning C4251 “class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class
- warning C4251: 'm_ListInfo' : struct 'DuiLib::tagTListInfoUI' needs to have dll-interface to be used
- warning C4251: 'vectortemp::m_Vector' : class 'std::vector' needs to have dll-interface to be used by clients of class 'vectorte
- 【VC编译问题】如何解决VC中的警告Warning C4251
- 如何解决VC中的警告Warning C4251
- 如何解决VC中的警告Warning C4251
- 如何解决VC中的警告Warning C4251--- 转载
- 如何解决VC中的警告Warning C4251
- 'needs to have dll-interface' warning
- 如何解决PHP startup: Unable to load dynamic library的错误(php中的各dll间的相依关系)
- 7.VC(custom)-解决DLL和主调程序的资源冲突及如何使用Dll的资源
- 如何解决Linux下Qt Creator调试C/C++程序出现Debugging starts &"warning: GDB: Failed to set controlling terminal警告
- [笔记].怎样解决MDK中的警告:Warning: L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices.)
- 【转】WARNING! File system needs to be upgraded. You have version null and I want version 7. Run the '${HBASE_HOME}/bin/hbase migrate' script. 的解决办法
- 如何解决You don't have permission to access / on this server