Gui 程序不使用 WinMain 入口点

问题描述 投票:0回答:1

我正在尝试遵循很棒的手工英雄系列,但在 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 子系统,但我想不会。

我缺少链接器标志吗?

clang msys2
1个回答
0
投票

与 MSVC(根据所选子系统在

main()
WinMain()
之间进行选择)不同,MinGW 接受这两个选项,而不管子系统如何(无论
-mwindows
标志如何)。

如果两者都定义了,那么

main()
似乎优先于
WinMain()
,并且简单地删除
main()
将使其优先于
WinMain()


如果我没记错的话,MinGW 提供了一个默认的

main()
,它是一个弱符号,它调用
WinMain()
。因此,您可以定义
WinMain()
来调用,或者定义
main()
来覆盖默认值。

这也解释了为什么如果两个函数都没有定义,MinGW 会说

undefined reference to WinMain

© www.soinside.com 2019 - 2024. All rights reserved.