【问题标题】:Using and exporting std::string and std::vector<std::string> with Visual Studio 2015在 Visual Studio 2015 中使用和导出 std::string 和 std::vector<std::string>
【发布时间】:2015-10-20 17:42:38
【问题描述】:

使用 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>::_Mypair': 班级 'std::_Compressed_pa​​ir>,std::_String_val>,true>' 需要有 dll 接口供类的客户端使用 'std::_String_alloc>'

对于 std::vector 也是如此:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector(679): 警告 C4251: 'std::_Vector_alloc>::_Mypair': 类 'std::_Compressed_pa​​ir,std::allocator>>>,std::_Vector_val,std::allocator>>>,true>' 需要有 dll 接口供类的客户端使用 'std::_Vector_alloc>'

虽然这些在这个人为的测试用例中看似无害且测试运行良好,但我想修复它们。

更严重的是,如果我使用静态库代替 DLL,链接将完全失败:

c.lib(c.obj) : 错误 LNK2001: 无法解析的外部符号 "public: static unsigned __int64 const std::basic_string,class std::allocator >::npos" (?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2_KB)

我在尝试使用 VS2015 构建其他项目时也遇到了后一个错误。

我的问题是:

  1. 在 VS2015 中,字符串和向量类到底发生了什么变化?
  2. 我在这里正确地导出了字符串和向量类吗?我认为它符合这里的指导:https://support.microsoft.com/en-us/kb/168958
  3. 我应该进行哪些更改来修复静态链接错误和 DLL 警告,以便它可以在 VS2015 和 VS2013 中工作? (我将把 2012 年留到另一天,因为它有一组单独的问题)。

非常感谢您的见解, 罗杰

【问题讨论】:

  • 谢谢,但我已经遵循了那里的大部分指导。这并没有解决静态链接的问题,也没有解决 VS2015 中的变化。
  • 这或多或少是stackoverflow.com/q/22797418/103167的副本
  • @BenVoigt 请注意,您链接到的帖子更为笼统,并且可能涉及使用不同的 VC 版本;这里的问题没有。

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


【解决方案1】:

您无法在多个版本的 Visual C++ 中执行此操作。每个版本的类定义都不同,因此如果您尝试将混合版本链接在一起,则违反了单一定义规则。

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

【讨论】:

  • 请注意,这个问题不是是关于如何跨多个可视化 C++ 版本工作。它是关于导出和使用 STL 类型以用于单个 VC 版本。
【解决方案2】:

删除std::char_traits&lt;char&gt;的导出:

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

删除静态链接错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多