- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我声明了一些 C++ 函数原型(prototype)如下:
extern "C" void __stdcall function();
我还有一些带有导出 function()
的第三方 dll - 根本没有名称修饰。由于 undefined reference to function@...
,由于 MinGW 的 stdcall @-suffix,我无法构建我的 exe 或 dll。如何在没有 @... 的情况下获取目标文件,只是简单的函数名称?
最佳答案
听起来您正在尝试使用 MinGW 编译一个使用来自第三方 dll 的外部 C 函数的程序。有一种方法可以将这些外部函数导出到 MinGW 的 gnu ld
链接器可以使用的适当导入库中,但它涉及创建一个 .def
定义文件。这样做的好处是,一旦你创建了一个合适的导入库,你就不必摆弄像 --add-stdcall-alias
或 --kill-at
这样的开关因为导入库将包含编译器和链接器所需的符号。
这是执行此操作的大致过程:
dlltool.exe
的工具,它应该包含在与编译器相同的 MinGW/bin
目录中。这是定义文件的样子:
;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
需要注意几件重要的事情。 EXPORTS
部分必须按照工具链的预期以相同的名称装饰格式列出导出的符号/函数。在这种情况下,MinGW 编译器和 ld 链接器期望 __stdcall
C 函数附加一个“@”,后跟参数中的字节数。需要注意的第二个重要事项是 dlltool -k
将删除“@”,这与您已经看到的 --kill-at
选项的作用相同.这样做的最终结果是您拥有一个带有正确内部名称修饰的导入库,因此可以正确解析,并且该内部名称将映射到您的第 3rd 中导出的可见名称 派对 dll。
最后一件事需要提及。在整个示例中,我们假设 dll 中未修饰的名称使用了 __stdcall
,但这不一定是真的。下图 ( taken from here ) 显示了不同的编译器如何以不同的方式修饰 __cdecl
与 __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
确保调用约定正确匹配或冒堆栈损坏和神秘程序崩溃的风险取决于您。
关于c++ - mingw32 g++ 和 stdcall @suffix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063842/
我在尝试为 Android(在 linux x86_64 上)编译 Qt 5 时遇到此错误: cc1plus: error: -Werror=literal-suffix: no option -Wl
当我在 Playground xcode 9.2 上运行时,苹果文档代码中出现上述错误 https://developer.apple.com/library/content/documentatio
我根本找不到任何解释后缀数组的好的教学资源。甚至 "bible"不包括它。 我在哪里可以找到对后缀数组及其用途的清晰透彻的解释? (视频类(class)是理想的,因为我很懒。) 最佳答案 Dan Gu
我正在寻找快速suffix-array构造算法。我对实现的简易性和原始速度比渐近复杂性更感兴趣(我知道后缀数组可以通过后缀树在 O(n) 时间内构造,但这需要大量空间;显然其他算法有糟糕的最坏情况大
我的ASP.NET Web API具有Search方法,可在Elasticsearch数据库中搜索特定查询。用户还可以设置排序参数(例如属性)以进行排序,或者是否应按升序或降序排序。 http://l
我可以使用 prefix-out重命名我导出的标识符,使它们都具有相似的前缀。例如: #lang racket (provide (prefix-out mymod: (all-defined-out
我真的很想了解一个关于如何为给定模式构建良好后缀表的示例。问题是,我无法理解它。我看过很多例子,但不知道这些数字来自哪里。 所以这里是:以下示例演示了如何根据模式 ANPANMAN 构建良好后缀表:
我在 R 中使用正则表达式。我试图找出字符向量中某些字符串末尾带括号的内容。我能够在括号内的内容存在时找到它,但我无法在没有括号的输入中排除非括号内的内容。 例子: > x gsub("(.*?)(
我正在GAMS中求解模型。运行优化模型时,我想将最佳解决方案保存在新变量中。代码的核心如下所示: variables xSave(t) 'saving the value of x at opt
这是一个错误还是有文档表明不要在指令名称中使用后缀“start”?只有“完成”指令有效。 HTML: ... Angular doesn't like the suffix 'start'
我最近继承了一个遗留的 Windows 二进制文件及其源代码,它显然是用 Fortran(我不熟悉的语言)编写的。为了了解它是如何工作的,我查看了源代码,这个语法引起了我的注意: DIMENS
我刚刚发现自己创建了一个名为“InstructionBuilderFactoryMapFactory”的类。那是一类的 4 个“模式后缀”。它立即让我想起了这一点: http://www.jrolle
对于两个字符串 A 和 B,我们将字符串的相似度定义为两个字符串共有的最长前缀的长度。例如字符串“abc”和“abd”的相似度为2,而字符串“aaa”和“aaab”的相似度为3。 问题是给出一个算法来
当我反汇编 Chromium 二进制文件时,我注意到有一些函数以这种模式命名:_ZN6webrtc15DecoderDatabase11DecoderInfoD2Ev.part.1 如果我把这个字符串
我有一个字符串数组,它们是我的应用程序包中的文件名。有些是 PNG,有些是 MOV。 Swift 中有没有检查字符串后缀的好方法? 最佳答案 使用hasSuffix 和filter 方法,如下所示:
我正在尝试使用插入完成。 看来我应该使用一个名为 suffix: 的参数来告知插入结束的位置。 端点的负载:POST/v1/completions { "model": "code-davinci
我刚刚开始使用 JHipster,并且正在尝试 5.0.0-beta.1。我尝试使用 React 前端创建一个简单的应用程序。 我还尝试导入 https://www.jhipster.tech/jdl
我正在尝试使用插入完成。 看来我应该使用一个名为 suffix: 的参数来告知插入结束的位置。 端点的负载:POST/v1/completions { "model": "code-davinci
我使用 java API 根据给定的 URL 提取第二个域名。 https://github.com/whois-server-list/public-suffix-list 它基于 Mozilla
我不知道这到底叫什么,也不知道它是否可能。但基本上我想向“不完整”的方法添加内容。例如。 captureDog =()=>{ alert('caught dog'); } captureCat =
我是一名优秀的程序员,十分优秀!