如何匹配链接器符号以实现与 MinGW 的最小 Win32 链接?

How to match linker symbols for minimal Win32 linking with MinGW?

提问人:Zhro 提问时间:7/24/2022 最后编辑:Brecht SandersZhro 更新时间:7/25/2022 访问量:81

问:

我想从 Cygwin 程序中进行一些 Win32 API 调用,但是我无法导入而不会出现重新定义问题。我不需要整个标题,而只需要几个选择函数。所以我想我可以使用相同的声明手动导入它们。但这似乎行不通。windows.h

这是我尝试导入的示例程序:Sleep()

#define DECLSPEC_IMPORT __declspec(dllimport)
#define WINAPI __stdcall
#define WINBASEAPI DECLSPEC_IMPORT
typedef unsigned long DWORD;
WINBASEAPI void WINAPI Sleep(DWORD);

int main() {
   Sleep(1);
   
   return 0;
}

但是,我仍然无法正确匹配链接器符号:

$ nm -gC libkernel32.a | grep -i sleep
00000000 T SleepEx@8
00000000 I _imp__SleepEx@8
00000000 T Sleep@4
00000000 I _imp__Sleep@4

链接器错误:

$ g++ main.cpp -o a.out -mwindows
/cygdrive/c/WINDOWS/TEMP/ccY6MURi.o:main.cpp:(.text+0x32): undefined reference to `__imp___Z5Sleepm@4'
collect2: ld returned 1 exit status

如果我没有这个问题,我没有这个问题。即使我已经完全匹配了声明,为什么符号不同?#include <windows.h>

linker cygwin mingw undefined-reference

评论

0赞 ssbssa 7/25/2022
尝试添加到声明中。extern "C"Sleep
0赞 Zhro 7/25/2022
就是这样。我错过了外部“C”。谢谢。

答:

-2赞 Brecht Sanders 7/25/2022 #1

你为什么不直接使用?这是正确的方法。#include <windows.h>

链接器错误指示问题与 C++ 调用约定有关。你试过用代替吗?gccg++

如果您只使用 .#include <windows.h>

评论

0赞 Zhro 7/25/2022
我无法导入 windows.h 而不会出现重新定义问题。
0赞 Doug Henderson 7/25/2022
使用,然后向我们展示 gcc 或 g++ 命令行以及您看到的所有错误和警告的全文。#include <windows.h>
0赞 Brecht Sanders 7/26/2022
@Zhro 为什么需要重新定义已经正确定义的内容?只需启动程序,然后定义 .windows.h#include <windows.h>main
0赞 Zhro 7/26/2022
由于重复的定义,我不能这样做。
0赞 Brecht Sanders 7/26/2022
这没有意义。如果只有后面跟着,则不应有重复的定义,除非您的构建环境已损坏。如果是这种情况,您可以尝试使用不同的构建环境,例如独立的 MinGW-w64 构建 winlibs.com,看看是否构建了简单的程序。#include <windows.h>main