j.l*_*.l. 1 c++ linker mingw stdcall name-decoration
我声明了一些C++函数原型如下:
extern "C" void __stdcall function();
Run Code Online (Sandbox Code Playgroud)
我也有一些第三方dll导出function()- 根本没有名字装饰.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
Run Code Online (Sandbox Code Playgroud)
几个重要的事情要注意.该EXPORTS部分必须以工具链所期望的相同名称装饰格式列出导出的符号/函数.在这种情况下,MinGW编译器和ld链接器期望__stdcallC函数附加一个'@'后跟参数中的字节数.需要注意的第二个重要事项是dlltool -k删除'@',它与--kill-at您已经看过的选项完全相同.这样做的最终结果是你有正确的内部名称装修的导入库,这样的事情解决不好,而且是内部名称将映射到你的3发现导出的可视名称RD党的DLL.
最后一件事需要提及.在整个示例中,我们假设使用的dll中未修饰的名称__stdcall不一定是真的.下面的图表(取自此处)显示了不同编译器的装饰__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
Run Code Online (Sandbox Code Playgroud)
由您来确保呼叫约定正确匹配或风险堆栈损坏和神秘的程序崩溃.
man ld为您提供 --enable-stdcall-fixup链接非@修饰库的选项。我不确定前导下划线是否会出现问题,您必须尝试一下。
如果您想使用 mingw 生成目标文件或 DLL,并且希望导出名称不带“@”,--kill-at那么您的朋友。
| 归档时间: |
|
| 查看次数: |
8957 次 |
| 最近记录: |