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

2024-03-21

使用 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 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::_压缩对>,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::_压缩对,std::分配器>>>,std::_Vector_val,std::分配器>>>,true>' 需要有 dll 接口供类的客户端使用 'std::_Vector_alloc>'

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

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

c.lib(c.obj) :错误 LNK2001:无法解析的外部符号“public: 静态无符号 __int64 const std::basic_string,类 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 https://support.microsoft.com/en-us/kb/168958
  3. 我应该做哪些更改来修复静态链接错误和 DLL 警告,以便它可以在 VS2015 和 VS2013 中工作? (我将把 2012 年留到另一天,因为它有一系列单独的问题)。

非常感谢您的见解, 罗杰


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Visual Studio 2015 中使用和导出 std::string 和 std::vector 的相关文章

  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 为什么这个函数指针赋值在直接赋值时有效,但在使用条件运算符时无效?

    本示例未使用 include 在 MacOS10 14 Eclipse IDE 上编译 使用 g 选项 O0 g3 Wall c fmessage length 0 假设这个变量声明 int fun int 这无法通过 std touppe
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul

随机推荐

  • PIG 将文本行转换为稀疏向量

    我必须使用 Apache PIG 将需要合并的文件 第一个文件包含书名列表 就像这样 每个书名都单独一行 Ted Dunning Mahout in Action Leo Tolstoy War and Peace Douglas Adam
  • Angular2 中 Http.DELETE 请求的正文

    我正在尝试与 Angular 2 前端的某种 RESTful API 进行交互 要从集合中删除某些项目 除了删除的唯一 id 可以附加到 url 中 之外 我还需要发送一些其他数据 即身份验证令牌 一些集合信息和一些辅助数据 我发现最直接的
  • django m2m_changed 通过模型自定义

    在 Django 中 我确实有两个模型 作者 和 出版 它们与多对多字段连接 以便我可以将不同的作者分配给出版物 此外 我必须使用自定义的贯穿模型 作者身份 来定义正确的顺序 class Author models Model first
  • 我如何在谷歌应用程序引擎上为 html5 创建 websocket

    这是demo http html5demos com web socket一个简单的聊天客户端 您必须在 webkit 浏览器上打开它 例如 chrome 和 Safari 该演示使用基于node js的Web套接字服务器 websocke
  • 错误:ANDROID_HOME 未设置,并且“android”命令不在您的路径中。您必须至少满足其中一项条件。

    我正在尝试安装 PhoneGap 但收到以下错误 错误 ANDROID HOME 未设置 并且 android 命令不在您的路径中 您必须至少满足其中一项条件 错误 截图 我该如何确保 Android 正确设置以与 Cordova 一起使用
  • Angular2 提供自定义 Http 不起作用

    我们需要一个全局空间来捕获 http 401 403 和 500 响应 我看了一些教程并尝试了扩展 http 的方法 这是我自定义的HTTP 大部分是从网上复制的 import Http ConnectionBackend Request
  • 防止 XAML 中的重复代码

    我在 UniformGrid 中使用了很多 Rectangle 控件 它们含有 XAML 代码的所有相同部分都处理通过 MultiBinding 设置 Fill 属性 请参见下面的示例 有没有办法防止这种代码重复 减少 XAML 代码的首选
  • Chrome webkit 检查器中不断生成“不安全的 JavaScript 尝试使用 URL 访问框架...”错误

    例如 当使用 Facebook API 时 Chrome 或任何其他 webkit 浏览器 会抛出大量 不安全的 JavaScript 尝试使用 URL 访问框架 它不会干扰实际操作 但确实使 javascript 控制台基本无法使用 我想
  • proxy_pass 不使用 /etc/hosts 解析 DNS

    在 Nginx 中proxy pass指令未使用以下命令解析 DNS etc hosts文件 有什么方法可以实现这种可能性 也许利用 Lua 作为最后的手段 如果您有一台带有 systemd 的服务器 您可以使用它附带的名称服务器 syst
  • 如何了解我的 Android 应用在用户设备上消耗了多少电池?

    我正在编写一个应用程序来评估 Android 上蓝牙 P2P 网络的可行性 我注意到 在 Galaxy Nexus 上 它使用的电池很少 而在 Nexus S 上 它消耗电池的速度非常快 这是由于蓝牙导致CPU负载过高直接导致的 现在 我想
  • Camel中如何动态添加和启动路由?

    我正在尝试从 Camel 的路线中删除一些样板 例如 让我们考虑两条相似的路线 并且可以生成它们的大部分内部内容 我创建了一个组件 模板 它创建了TemplateEndpoint 并修改了 XML 配置以使用模板组件 自定义方法Templa
  • 适用于 Android 的自定义旋转对话框

    如何制作自定义主题 Android Spinner 对话框 该博客有一个示例 可能可以解决您的问题 http www mokasocial com 2011 03 easily create a default custom styled
  • SKLearn Naive Bayes:在 tfidf 矢量化后添加特征

    因此 我的任务是训练一个电话记录模型 以下代码执行此操作 一些背景信息 x 是一个字符串列表 每个第 i 个元素是一个完整的转录本 y 是布尔值列表 表示调用的结果是正还是负 以下代码有效 但这是我的问题 我想将通话时长作为一项训练功能 我
  • 带 ProgressBar 的 Endless RecyclerView 用于分页

    我正在使用一个RecyclerView http developer android com reference android support v7 widget RecyclerView html并以十个为一组从 API 获取对象 对于
  • PHP 未在正确的位置回显

    我在我的 WordPress 网站上运行一些 PHP 代码 当 PHP 运行以回显某些信息时 它没有在正确的位置回显它 代码的缩写版本是 div class description cms div h2 Search By Category
  • 使用 Ruby On Rails 进行事务操作

    我在控制器内有一个复杂的操作 可以对数据库执行多个更新查询 我怎样才能做出这个动作行为类似于交易没有任何结构重构 MyModel transaction do begin model update stuff sub model updat
  • 如何让控件重绘 Windows 窗体?

    我不太确定 重绘 是我正在寻找的 我是手工设计 Windows 窗体的新手 我创建了一个类 它将使用 TableLayoutPanel 作为传递的变量 并在该表格布局面板中进行自己的设计 以便可以重用该控件并调整其参数以适应其包含的数据 我
  • 用于本机 C++ 的 C++/CLI 包装器,可在 C# 中用作参考

    标题解释了 我有本机 C dll 正在为其编写 C CLI 包装器 这些包装器将依次导入到 C 中作为参考 问题是在 C 中我看不到包装器中的类 从 DLL 导入 我应该使用哪些关键字以及如何重新声明我的本机 C 对象以在 C 中可见 好的
  • 角度从 1 开始 ngFor 索引

    ngFor索引是否可以从1而不是0开始 let data of datas let i index 1 没用 ngFor let item of items slice 1 let i index 切片管 https angular io
  • 在 Visual Studio 2015 中使用和导出 std::string 和 std::vector

    使用 VS2013 和合适的导出宏 我可以使用此示例代码导出 std string 和 std vector ifdef MSC VER Explicit template exports c EXPORT TEMPLATE templat