创建DLL时遇到两个有关问题~ 静态数据成员string与向量vector的警告
创建DLL时遇到两个问题~ 静态数据成员string与向量vector的警告。
提示:
1> dllmain.cpp
1>g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\clientsocket.h(33): warning C4251: “ClientSocket::defaultIp”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“ClientSocket”的客户端使用
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
提示:
1> g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\iocpserversocket.h(26): 参见对正在编译的类 模板 实例化“std::vector<_Ty>”的引用
1> with
1> [
1> _Ty=BaseSocket
1> ]
1> ClientSocket.cpp
1>g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\clientsocket.h(33): warning C4251: “ClientSocket::defaultIp”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“ClientSocket”的客户端使用
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
按照网上所说的方法加上 template class __declspec(dllexport) std::vector <BaseSocket>; 还是不起作用~
这问题该怎么解决呢?
PS: 这天可能断网,只能用手机上网,可能周一才能结帖~ 不过会用手机留意信息~
------解决方案--------------------
类的静态成员变量,要在类外(cpp中)单独导出。
顺便在dll和客户端交互的部分,不推荐用stl。
------解决方案--------------------
不要把模板库导出,寻找其它替代方式,比如用成员函数代替stl的数据成员,把模板类型都隐藏起来。导出成员函数的类型和参数都不要用模板类。理由解释过无数遍:因为模板是编译期多态的,在不同模块中可能是完全不同内存布局的类型,虽然冠以相同的名称。
------解决方案--------------------
不要去导出vector,你可以导出一组接口,作为插入、查询以及导出功能。
- C/C++ code
//class __declspec(dllexport) std::string defaultIp; //template typename __declspec(dllexport) std::string; class _declspec(dllexport) ClientSocket: public BaseSocket { private: DataManage * dataManage; bool hasConnect; void init(DataManage*); public: static std::string defaultIp; ... };
提示:
1> dllmain.cpp
1>g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\clientsocket.h(33): warning C4251: “ClientSocket::defaultIp”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“ClientSocket”的客户端使用
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
- C/C++ code
template class __declspec(dllexport) std::vector <BaseSocket>; class _declspec(dllexport) IocpServerSocket: public ServerSocket { private: HANDLE completionPort; // 完成端口的句柄 std::vector <BaseSocket> * clientGroup; // 创建客户端组 ... }
提示:
1> g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\iocpserversocket.h(26): 参见对正在编译的类 模板 实例化“std::vector<_Ty>”的引用
1> with
1> [
1> _Ty=BaseSocket
1> ]
1> ClientSocket.cpp
1>g:\temp\iocp_tcp_socket_encapsulation\v02_iocp_tcp_socket_encapsulation\encapsulation\encapsulation\clientsocket.h(33): warning C4251: “ClientSocket::defaultIp”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“ClientSocket”的客户端使用
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
按照网上所说的方法加上 template class __declspec(dllexport) std::vector <BaseSocket>; 还是不起作用~
这问题该怎么解决呢?
PS: 这天可能断网,只能用手机上网,可能周一才能结帖~ 不过会用手机留意信息~
------解决方案--------------------
类的静态成员变量,要在类外(cpp中)单独导出。
顺便在dll和客户端交互的部分,不推荐用stl。
------解决方案--------------------
不要把模板库导出,寻找其它替代方式,比如用成员函数代替stl的数据成员,把模板类型都隐藏起来。导出成员函数的类型和参数都不要用模板类。理由解释过无数遍:因为模板是编译期多态的,在不同模块中可能是完全不同内存布局的类型,虽然冠以相同的名称。
------解决方案--------------------
不要去导出vector,你可以导出一组接口,作为插入、查询以及导出功能。