如何在Windows上使用CMake将C ++应用程序入口点设置为main()?

Arnav borborah

我最近开始使用CMake,并试图构建一个GUI应用程序,该应用程序在Windows上没有控制台窗口。所以在我的CMakeLists.txt文件中,我这样做:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    add_executable(${EXECUTABLE_NAME} main.cpp)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    add_executable(${EXECUTABLE_NAME} WIN32 main.cpp) #WIN32 So the console window does not open on Windows
endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")

这样,解决方案就可以了,并且在Windows上不会打开控制台窗口。但是,这是有代价的。尝试构建解决方案时,我意识到必须将函数的签名更改为WinMain,因此我将主代码更改为以下内容:

#ifdef _WIN32
#include <Windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int) //Windows signature since creating WIN32 application without console
#else
int main()
#endif
{
    // ... GUI code
}

不幸的是,我绝对不赞成这样做,因为它破坏了使用CMake的全部意义。我不想更改基于不同平台的代码中的任何内容。这使我想到了我的问题。main()制作GUI应用程序时,如何在Windows中将C ++应用程序入口点设置为Windows,而不必在Visual Studio中手动设置它?我可以使用跨平台方法直接在CMake中执行此操作吗?还是我必须使用该#if/#else/#endif解决方案?上面解决方案的唯一改进是使用MAIN_FUNCTION有条件预处理器的宏我也想避免这种情况。

另一方面,是否有另一种方法可以摆脱Windows上的GUI应用程序中的控制台窗口,而我却不知道该如何使用CMake而不使用WIN32选项?

加布里埃尔·亚历山大(Gabriel Alexander)

解决方法是在set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")之前添加add_executable

它隐藏了控制台,同时仍然允许您使用常规int main()的入口点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Autofac将依赖项注入控制台应用程序的Main入口点

Objective-C中应用程序的入口点

使用VS2015更改应用程序的入口点

如何在Visual Studio(C ++)中查找应用程序的入口点

我的控制台应用程序上出现错误“程序不包含适用于入口点的静态'Main'方法”

将应用程序设置为默认应用程序

在32位C ++ Builder应用程序上找不到入口点

在具有入口点的应用程序上使用cProfile

如何创建Conda程序包/应用程序的入口点?

如何使用`dependOn`从主入口点捆绑单独的应用程序文件?

如何从 docker shell 脚本(入口点)调用 spring-boot java 应用程序?

如何为多个Mule应用程序实现通用的HTTP入口点?

如何打包具有多个入口点的Java应用程序

使用Detox和React Native更改应用程序入口点

如何在Windows上打包使用CMake构建的Qt程序?

为使用上下文根运行的应用程序编写入口规则

如何将WinMain设置为入口点?

如何在C#XAML Windows 8.1应用程序中将TextBlocks设置为正确的大小?

如何在Mac上将MacVim设置为“应用程序”;

如何将uget设置为启动应用程序

如何在Windows 10上设置默认应用程序?

如何使用 Jmeter 为 Web 应用程序设置基线

如何使用 PyGObject 为整个应用程序设置图标

如何通过不带资源文件的cmake为C#Windows Forms应用程序设置图标?

如何在Windows 8中为程序(应用程序)设置密码?

如何在Ubuntu上为KDE应用程序设置默认应用程序首选项?

Java应用程序的入口点:main(),init()或run()?

Jenkins在MacOSX上为Xamarin Forms应用程序设置

使用 ID 调用我的 Angular 应用程序入口点时出现问题 - 无法匹配任何路由