使用VS2013和一个合适的导出宏,我可以使用这个示例代码导出std :: string和std :: vector:
#ifdef _MSC_VER
// Explicit template exports.
c_EXPORT_TEMPLATE template class c_EXPORT std::allocator<char>;
c_EXPORT_TEMPLATE template struct c_EXPORT std::char_traits<char>;
c_EXPORT_TEMPLATE template class c_EXPORT std::basic_string<char, std::char_traits<char>, std::allocator<char> >;
c_EXPORT_TEMPLATE template class c_EXPORT std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >;
c_EXPORT_TEMPLATE template class c_EXPORT std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >;
#endif
(这里可编译的测试用例:https://github.com/rleigh-dundee/dlltest) - 这既可以作为静态库使用,也可以作为DLL使用
cmake -G“Visual Studio 12 2013 Win64”-DBUILD_SHARED_LIBS = ON | OFF / path / to / source
使用VS2015(“Visual Studio 14 2015 Win64”)在使用与std :: string相关的DLL进行编译时会收到警告:
c:\ users \ rleigh \ libtest \ a.h(30):警告C4251: '的std :: _ String_alloc&GT; :: _ Mypair': 类 '的std :: _ Compressed_pair&GT;,的std :: _ String_val&GT;,真&gt;' 需要让dll接口供类的客户使用 '的std :: _ String_alloc&GT;'
和std :: vector类似:
C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ include \ vector(679):警告C4251:'std :: _ Vector_alloc&gt; :: _ Mypair':class '的std :: _ Compressed_pair,性病::分配器&GT;&GT;&GT;,的std :: _ Vector_val,性病::分配器&GT;&GT;&GT;,真&gt;' 需要让dll接口供类的客户使用 '的std :: _ Vector_alloc&GT;'
虽然这些,在这个人为的测试用例中,看似无害,测试测试运行良好,我想修复它们。
更严重的是,如果我使用静态库代替DLL,则链接完全失败:
c.lib(c.obj):错误LNK2001:未解析的外部符号“public: static unsigned __int64 const std :: basic_string,class std :: allocator&gt; :: npos“ (?非营利组织@?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ 2_KB)
我在尝试使用VS2015构建其他项目时遇到了后一个错误。
我的问题是:
非常感谢您的见解, 罗杰
答案 0 :(得分:1)
在Visual C ++的多个版本中,您无法做任何事情。每个版本的类定义都不同,因此如果您尝试将混合版本链接在一起,则会违反“一个定义规则”。
跨DLL边界导出标准库对象没有好处,我建议你找到一种更简单的方法(仅使用标准布局类型)传递数据。
答案 1 :(得分:0)
删除std::char_traits<char>
的导出:
b_EXPORT_TEMPLATE template struct b_EXPORT std::char_traits<char>;
删除静态链接错误。