如何告诉cmake不要创建控制台窗口?

15

我可以通过gcc实现这个功能:

gcc -mwindows -o simple simple.c

但只在CMake中找到这个:

add_executable(simple WIN32 simple.c)

但这并不完全与-mwindows相同,

这将需要入口点为WinMain,

gcc -mwindows则不需要这样(可以是main)。

我应该如何正确地做呢?


这是一个重复的问题,与https://dev59.com/hXE85IYBdhLWcg3wejjn相同。 - MKroehnert
这个回答解决了你的问题吗?cmake 中与 gcc 的 -mwindows 选项等价的是什么? - legends2k
4个回答

23

如果您使用:

add_executable(simple WIN32 simple.c)

如果你想要编写一个Windows程序,那么必须提供一个WinMain函数。这就是在add_executable中添加WIN32标志的含义:它表示你将会创建一个Windows程序,并提供一个WinMain函数。

如果你确实在编写一个Windows应用程序,我建议按照这种方式来做。这是最有意义、最符合底层操作系统的方法。

然而,如果你仍想传递"-mwindows"标志给gcc,但是仍然想使用"main"函数,那么只需将"-mwindows"添加到CMAKE_CXX_FLAGS和/或CMAKE_C_FLAGS值中即可。你可以通过调整这些变量来交互式地包含"-mwindows",也可以通过命令行CMake来完成,像这样:

cmake -DCMAKE_C_FLAGS="-mwindows"

1
刚刚发现了这个,解决了cmake和无控制台的Windows应用程序之间非常烦人的问题。特别是在项目进行到一半并且cmake已经被编织后才有了去除控制台的愿望。谢谢! - Darakian

2

如果你需要在Windows和Linux上使用它

if (WIN32)
    # /ENTRY:mainCRTStartup keeps the same "main" function instead of requiring "WinMain"
    set(SUBSYSTEM_LINKER_OPTIONS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
else()
    set(SUBSYSTEM_LINKER_OPTIONS "-mwindows")
endif()

target_link_options(TargetName PRIVATE ${SUBSYSTEM_LINKER_OPTIONS})

相关问题


1
如DLRdave所说,指出可执行文件将是win32意味着它将具有WinMain作为入口点,并且是一个Windows应用程序。
如果该应用程序仍要跨平台,则通常抑制控制台窗口但仍允许使用main的方法是编写一个存根WinMain,如SDL或SFML库中所找到的那样,它只是使用全局变量__argc和__argv作为参数调用主函数并返回其结果。
这可以防止应用程序具有控制台窗口,但减少了使用WinMain作为入口点的代码干扰。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接