我最近开始使用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选项?
解决方法是在set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
之前添加add_executable
它隐藏了控制台,同时仍然允许您使用常规int main()
的入口点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句