在Visual Studio 2015中使用和导出std :: string和std :: vector <std :: string>

时间:2015-07-29 16:01:59

标签: c++ cmake visual-studio-2015 static-linking dynamic-linking

使用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 :: _ St​​ring_alloc&GT; :: _ Mypair':   类   '的std :: _ Compressed_pa​​ir&GT;,的std :: _ St​​ring_val&GT;,真&gt;'   需要让dll接口供类的客户使用   '的std :: _ St​​ring_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_pa​​ir,性病::分配器&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构建其他项目时遇到了后一个错误。

我的问题是:

  1. VS2015到字符串和向量类的确切变化是什么?
  2. 我在这里正确导出字符串和向量类吗?我认为它符合这里的指导:https://support.microsoft.com/en-us/kb/168958
  3. 我应该做些什么更改来修复静态链接错误和DLL警告,以便它在VS2015和VS2013中都能正常工作? (我将在2012年离开另一天,因为它有一套单独的问题)。
  4. 非常感谢您的见解, 罗杰

2 个答案:

答案 0 :(得分:1)

在Visual C ++的多个版本中,您无法做任何事情。每个版本的类定义都不同,因此如果您尝试将混合版本链接在一起,则会违反“一个定义规则”。

跨DLL边界导出标准库对象没有好处,我建议你找到一种更简单的方法(仅使用标准布局类型)传递数据。

答案 1 :(得分:0)

删除std::char_traits<char>的导出:

b_EXPORT_TEMPLATE template struct b_EXPORT std::char_traits<char>;

删除静态链接错误。

相关问题