提问人:Zhro 提问时间:7/24/2022 最后编辑:Brecht SandersZhro 更新时间:7/25/2022 访问量:81
如何匹配链接器符号以实现与 MinGW 的最小 Win32 链接?
How to match linker symbols for minimal Win32 linking with MinGW?
问:
我想从 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>
答:
-2赞
Brecht Sanders
7/25/2022
#1
你为什么不直接使用?这是正确的方法。#include <windows.h>
链接器错误指示问题与 C++ 调用约定有关。你试过用代替吗?gcc
g++
如果您只使用 .#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
评论
extern "C"
Sleep