mingw32 g++ 和 stdcall @suffix

2023-11-29

我声明了一些原型化的 C++ 函数,如下所示:

extern "C" void __stdcall function();

我还有一些导出的第三方 dllfunction()- 根本没有名字装饰。 由于以下原因,我无法构建我的 exe 或 dllundefined reference to function@...,因为 MinGW 的 stdcall @-后缀。如何在没有@...的情况下获取目标文件,只是简单的函数名称?


听起来您正在尝试使用 MinGW 编译一个使用第三方 dll 中的外部 C 函数的程序。有一种方法可以将这些外部函数导出到 MinGW 的正确导入库中gnu ld链接器可以使用,但它涉及创建一个.def定义文件。这样做的好处是,一旦创建了正确的导入库,您就不必摆弄像这样的开关--add-stdcall-alias or --kill-at因为导入库将包含编译器和链接器期望的符号。

以下是执行此操作的过程的粗略概述:

  1. 您需要一个工具调用dlltool.exe应该包含在同一MinGW/bin目录作为编译器。
  2. 您需要创建一个定义文件 (*.def),列出您有兴趣导入的所有外部函数。
  3. 通过运行 dlltool 并传入您创建的 .def 文件作为输入来创建导入文件存根 (*.a)。
  4. 在构建项目时将新创建的导入文件 *.a 传递给链接器,以便正确解析符号。

定义文件如下所示:

;Run the dlltool like this:
;dlltool -k -d third_party.def -l libthird_party.a
LIBRARY third_party.dll

EXPORTS
    dll_function1@0
    dll_function2@8
    dll_function3@16
;   ...
    dll_function_n@24

Couple of important things to note. The EXPORTS section has to list the exported symbols/functions in the same name-decorated format as expected by the toolchain. In this case, MinGW compiler and ld linker expects __stdcall C functions to be appended with an '@' follow by the number of bytes in the arguments. The second important thing to note is that dlltool -k will remove the '@', which does the same thing as the --kill-at option you've already seen. The end result of this is you have an import library with the correct internal name-decoration, so things resolve properly, and that internal name will map to the exported visible name found in your 3rd party dll.

最后需要提及的一件事。在整个示例中,我们assumingdll 中未修饰的名称使用__stdcall这不一定是真的。如下图(取自这里) 展示了不同编译器如何装饰__cdecl vs __stdcall不同的是:

                  MSVC DLL
Call Convention | (dllexport) | DMC DLL     | MinGW DLL  | BCC DLL
----------------------------------------------------------------------------
__stdcall       | _Function@n | _Function@n | Function@n | Function
__cdecl         | Function    | Function    | Function   | _Function

您需要确保调用约定正确匹配,否则将面临堆栈损坏和神秘程序崩溃的风险。

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

mingw32 g++ 和 stdcall @suffix 的相关文章

  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 在 PhpStorm 中打开和关闭 HTML 标签时添加自动注释

    我想添加 HTML 注释 div class div 以及他们各自的 div s 例如 假设我有一个 div class main container 我想在它之后立即发表评论 然后在其之后 div 我想要一个 一切都会是什么样子的一个例子
  • Roslyn:如何从当前加载的解决方案中获取对工作区的引用?

    我试图获取对当前加载的工作区的引用 但没有成功 根据文档 粗体部分 我应该能够获得它的参考 工作区 API 位于 Roslyn Services 命名空间中 并且 如果您包含以下 using 指令 则它们可用 使用 Roslyn Servi
  • Windows 8 Metro 是否支持托管 c++/cli

    我似乎无法在任何地方找到这个问题的答案 但是 Metro 会支持托管 C 吗 目前在 Visual Studios 2012 RC 中还没有 仅在 Metro 中 我有一些用 c cli 编写的框架 想将它们移植到 Metro 我知道 c
  • MSSQL - 将 1970 年以来的毫秒转换为 datetime2

    考虑以下查询 在 MSSQL 2008 中 SELECT dateModified FROM SomeTable 这将返回 javascript 格式的浮点数 自 1970 年以来的毫秒数 dateModified 130159829068
  • 如何查找实现给定接口的所有类?

    在给定的命名空间下 我有一组实现接口的类 我们就这样称呼它吧ISomething 我还有另一堂课 我们称之为CClass 知道ISomething但不知道实现该接口的类 我想要那个CClass寻找所有的实施ISomething 实例化它的实
  • 在 Windows 中安装 perl DBI-mysql 的问题

    我已经下载并安装了活动Perl在我的 Windows 7 64 机器上 一切都很顺利 也加载了perl翻译成我的Eclipse平台 但是 当我尝试访问localhostMySQL数据库 我得到以下错误 database
  • 如何摆脱整个选项列表周围的蓝色边框[重复]

    这个问题在这里已经有答案了 我想做的是 如果我单击选择框并且下拉列表显示下拉列表的蓝色边框颜色将被删除 测试链接 http jsfiddle net 5kcsn 320 script input select textarea form b
  • 如何创建以表达式作为参数的通用表达式

    有一个DisplayNameFor x gt x Title ASP Net MVC 中的助手 我想在行为上实现类似的东西 我想要一种接受基于表达式的方法User class u gt u Birthdate或 u gt u Name 一个
  • 如何使用 HTML 和 CSS 创建完全灵活的钢琴键盘

    我正在尝试创建一个钢琴键盘 该键盘将使用弹性框保持其元素比例 但一旦我开始更改窗口大小 似乎无法使黑色音符保持相同的宽度或高度 这里有一个fiddle body width 800px height 200px display flex k
  • 查找每个组的第一个实例并填充到 R 中的新列

    我有以下 df ID Date 1 01 01 2018 2 01 01 2010 2 01 01 2012 2 01 01 2013 3 01 01 2015 3 01 01 2018 我已按 ID 升序对列进行排序 但现在想要找到每个
  • 如何根据多个值过滤数据框中的单列

    我有一个数据框 我想按单个列中的多个值对其进行过滤 如何实现此目的 当我按奇异值过滤时 我通常使用df filtered df df column value 但至少在我尝试过的情况下 这对于 61 个值不起作用 谢谢 MRN Result
  • 将 URL 参数从 Flask 发送到 Bokeh 服务器

    我正在尝试将 Bokeh 自动加载 服务器集成到 Flask 应用程序中 其中要加载的数据集将由用户在另一个页面上选择 这组数据的ID位于URL 获取参数 中 我无法将其从Flask应用程序发送到Bokeh服务器 一些示例代码 flask
  • 在 PageViewer 中自动滚动

    我的页面查看器有问题 我希望我的页面每两秒滚动一次 我尝试这样的事情 handler postDelayed new Runnable public void run viewPager setCurrentItem viewPager g
  • BufferedImage 旋转,更改生成的背景

    当我使用旋转图像时Graphics2D rotate 显然它在角落里留下了一些空白空间 空的角落变得透明 我希望我的程序能够旋转BufferedImage并用白色填充剩余的空角 我该怎么做呢 换句话说 我想旋转图像 同时保留整个图像的白色背
  • 验证单元测试中私有方法调用的顺序

    我有以下课程 class MyClass public void doIt methodOne methodTwo methodThree private void methodOne rest of methods similar 我的目
  • R - 从名称列表中循环访问多个数据帧

    我有许多大型 DF 我想循环遍历它们 我认为我应该用它们的名字创建一个简单的向量并查看它们 而不是将它们绑定在一起形成一个大列表 但我该怎么做呢 例如我有 DF1 lt data frame c a b c c TRUE FALSE TRU
  • 当托管在 Heroku 上时,我可以让 node.js 监听非标准端口吗?

    我正在构建一个 Node js 应用程序 并尝试将其托管在 Heroku 上 似乎为了让我的应用程序可供全世界使用 我需要像这样听 app listen process env PORT 3000 我想让我的应用程序监听端口 8080 这在
  • 如何通过 Ant 显示 jUnit 错误

    我正在尝试将 Ant 脚本添加到我公司的项目中以运行 jUnit 测试 这是我所拥有的
  • WKHTMLTOPDF 与 Rails 上的 pdfkit 忽略表格分页符

    我知道 wkhtmltopdf 和分页符存在很多问题 这些问题可以追溯到几年前 但我还没有找到解决方案 我正在使用 PDFKit gem 将 html 页面生成为 pdf 但我不希望页面在表格行中间中断 我正在使用 wkhtmltopdf
  • mingw32 g++ 和 stdcall @suffix

    我声明了一些原型化的 C 函数 如下所示 extern C void stdcall function 我还有一些导出的第三方 dllfunction 根本没有名字装饰 由于以下原因 我无法构建我的 exe 或 dllundefined r