我在Qt Creator中创build一个应用程序,用cmake和MinGW作为编译器。 我已经看到这个问题被其他人回答,但他们使用.pro文件常规Qt项目,而我使用CMakeLists.txt文件。 所以这些post对我没有任何帮助。
问题是我的应用程序在启动时会打开一个控制台,和往常一样,closures这个控制台也会closures应用程序。 我想让应用程序不要打开一个控制台,这样对于那些不需要任何debugging信息的用户来说更方便用户。
你很可能在你的CMakeLists.txt中有一行如下:
ADD_EXECUTABLE(exename ....)
当然,这些点是进一步的论点。 将其更改为:
ADD_EXECUTABLE(exename [WIN32] ...)
指定它是一个Win32应用程序而不是控制台应用程序。
或者,可以在CMAKE网站上找到“如果WIN32
被赋予了属性WIN32_EXECUTABLE
将会在创建的目标上进行设置”。 当设置WIN32_EXECUTABLE时,它将“ 在Windows上用WinMain入口点构建一个可执行文件 ”。
我有同样的问题,但通过添加解决它:
#CMakeLists.txt # ... some text (like finding QT) LINK_LIBRARIES(${QT_QTMAIN_LIBRARY}) # ... and then ADD_EXECUTABLE(my_qt_project WIN32 ... )
如果我不使用LINK_LIBRARIES(${QT_QTMAIN_LIBRARY})
我得到错误:
error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
默认情况下,与qmake相比,cmake使用windows下启用的控制台窗口(windows二进制文件可以使用不同的入口点 – 控制台窗口就是其中之一)来构建Qt应用程序。
您可以通过设置可执行文件上的WIN32_EXECUTABLE
cmake属性来禁用出现的控制台窗口。
这可以通过设置一个add_executable
选项来实现,即
add_executable(myexe WIN32 ...)
或者通过显式设置属性:
set_property(TARGET main PROPERTY WIN32_EXECUTABLE true)
当有条件地禁用控制台窗口时,使用set_property()
会很有帮助,例如:
if(CMAKE_BUILD_TYPE STREQUAL "Release") set_property(TARGET main PROPERTY WIN32_EXECUTABLE true) endif()
在WIN32_EXECUTABLE
以外的平台上编译时, WIN32_EXECUTABLE
属性不起作用(参见CMAKE_WIN32_EXECUTABLE
)。
与WIN32
cmake变量一样, WIN32_EXECUTABLE
属性也在编译win64可执行文件时配置控制台窗口。
为了与Mingw一起建造,添加一个CMake命令:
set_target_properties(target_name PROPERTIES LINK_FLAGS "-mwindows")
将target_name
替换为您的目标名称(第一个参数为add_executable)
这是一个古老的问题,但无论如何,有比这里发布的其他所有的更好的解决方案:
CMAKE_POLICY(SET CMP0020 NEW)
添加这将自动处理你的一切。 如果你不设置这个策略,CMake实际上应该输出一个警告,至少我知道它的存在。