我正在尝试遵循很棒的手工英雄系列,但在 msys2 中使用 clang。我设置了一个简单的程序来测试编译,但是我无法让它使用 WinMain 入口点。
这是简单的程序
#include <windows.h>
int main(int argc, char **argv)
{
OutputDebugStringA(TEXT("hello console"));
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
OutputDebugStringA(TEXT("hello windows"));
}
使用 CodeLite,编译器/链接器命令如下所示:
C:/msys64/clang64/bin/clang++.exe -c "D:/Handmade/Handmade/main.cpp" -gdwarf-2 -fstandalone-debug -O0 -Wall -o ../build-Debug/Handmade/main.cpp.o -IC:\msys64\clang64\include\c++\v1 -IC:\msys64\clang64\lib\clang\16\include -IC:\msys64\clang64\include -I. -I.
C:/msys64/clang64/bin/clang++.exe -o ..\build-Debug\bin\Handmade.exe @../build-Debug/Handmade/ObjectsList.txt -L. -luser32 -Wl,-subsystem,windows
代码编译没有错误,但在查看 DebugView 时我看到“hello console”。因此 WinMain 没有被用作入口点。我希望 -Wl,-subsystem,windows 能够让它使用 gui 子系统,但我想不会。
我缺少链接器标志吗?
与 MSVC(根据所选子系统在
main()
和 WinMain()
之间进行选择)不同,MinGW 接受这两个选项,而不管子系统如何(无论 -mwindows
标志如何)。
如果两者都定义了,那么
main()
似乎优先于 WinMain()
,并且简单地删除 main()
将使其优先于 WinMain()
。
如果我没记错的话,MinGW 提供了一个默认的
main()
,它是一个弱符号,它调用 WinMain()
。因此,您可以定义 WinMain()
来调用,或者定义 main()
来覆盖默认值。
这也解释了为什么如果两个函数都没有定义,MinGW 会说
undefined reference to WinMain
。