太不容易了——在QT中使用CMake+MinGW构建带有图标的exe应用

本文档详细介绍了如何在QT项目从qmake转换为cmake的过程中,设置exe文件的图标以及修改其属性,包括产品名称、公司、版权等信息。通过配置CMakeLists.txt文件,利用windres编译rc资源文件,并针对MinGW和Visual Studio设置了不同的编译选项。同时,提供了完整的代码示例和微软官方文档链接作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

之前使用QT5.15写了一个图形应用,当时用的是qmake构建,但由于最近想导入一些别的库,qmake搞起来比较麻烦,使用cmake可以直接导入源代码,编译更加方便,所以尝试着将原本的qmake转换成cmake来构建应用,绝大部分工作可使用QT自家提供的qmake2cmake.py来实现,但exe图标和exe文件属性的问题涉及到使用windres编译rc文件并将其添加到exe,我搜了好久才自己探索了一个完整的方法。

使用方法

这里直接使用该项目中实际使用的代码作为示例,首先在CMakeLists.txt中添加以下代码:

set(PROJECT_DESCRIPTION "QFileTrans - 传输小助手")
set(PROJECT_INTERNAL_NAME "QFileTrans")
set(PROJECT_COPYRIGHT "Copyright XT29 2022")
set(PROJECT_ORIGINAL_FILENAME "QFileTrans")
set(PROJECT_PRODUCT_NAME "QFileTrans - 传输小助手")
set(PROJECT_COMPANY "XT29 Group")
set(PROJECT_LANG_CHARSET "080404B0")  # 简体中文
set(PROJECT_LANG_ID "0x0804")  # 简体中文
set(PROJECT_CHARSET_ID "1200")  # Unicode
set(PROJECT_ICON "QFileTransIcon.ico")

注意:根据StringFileInfo文档中的说明,PROJECT_LANG_CHARSET的前四位0804表示简体中文,而后四位04B0为1200的十六进制表示,表示采用Unicode编码,建议后四位不要修改,前四位可以修改为想要的语言。
另外,只修改PROJECT_LANG_CHARSET是不会修改最终文件中的语言属性的,必须根据VarFileInfo文档修改PROJECT_LANG_ID为0x0804才可以在文档属性中显示简体中文。

然后在你想要保存的目录新建一个versionInfo.rc.in文件,将下面的内容写入该文件:

#include <windows.h>

VS_VERSION_INFO VERSIONINFO
PRODUCTVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH},${PROJECT_VERSION_TWEAK}
FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH},${PROJECT_VERSION_TWEAK}

BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "${PROJECT_LANG_CHARSET}"
        BEGIN
            VALUE "CompanyName", "${PROJECT_COMPANY}\0"
            VALUE "FileDescription", "${PROJECT_DESCRIPTION}\0"
            VALUE "FileVersion", "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}\0"
            VALUE "InternalName", "${PROJECT_INTERNAL_NAME}\0"
            VALUE "LegalCopyright", "${PROJECT_COPYRIGHT}\0"
            VALUE "OriginalFilename", "${PROJECT_ORIGINAL_FILENAME}\0"
            VALUE "ProductName", "${PROJECT_PRODUCT_NAME}\0"
            VALUE "ProductVersion", "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
            VALUE "Translation", ${PROJECT_LANG_ID}, ${PROJECT_CHARSET_ID}
    END
END

IDI_ICON1 ICON DISCARDABLE "${PROJECT_ICON}"

最后在CMakeLists.txt中添加以下代码以自动修改rc文件内容:

if(WIN32)
    set(VersionInfoFile "${CMAKE_SOURCE_DIR}/versionInfo.rc.in")

    set(VersionInfoFileOut "${CMAKE_CURRENT_BINARY_DIR}/versionInfo.rc")
    configure_file(${VersionInfoFile} ${VersionInfoFileOut})

    file(COPY "${CMAKE_SOURCE_DIR}/${PROJECT_ICON}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
endif()

到了这里还是不能成功的,必须要手工指定rc文件编译器,在CMakeLists.txt中添加以下代码:

# Under Windows, we also include a resource file to the build
if(WIN32)
    # Make sure that the resource file is seen as an RC file to be compiled with a resource compiler, not a C++ compiler
    set_source_files_properties(${VersionInfoFileOut} LANGUAGE RC)
    # Add the resource file to the list of sources
    # For MinGW, we have to change the compile flags
    if(MINGW)
        # resource compilation for mingw
        set(CMAKE_RC_COMPILER_INIT windres)
        enable_language(RC)
        SET(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
        set(RC_CFLAGS "-DMINGW -Ocoff")
        # If any sort of debugging is being enabled, add a _DEBUG define to the flags for the resource compiler
        set_source_files_properties(${VersionInfoFileOut} COMPILE_FLAGS "${RC_CFLAGS}")
        # For anything else, assumingly Visual Studio at this point, use a different set of compile flags
    endif(MINGW)
    target_sources(${USING_PROJECT_NAME} PUBLIC ${VersionInfoFileOut})
endif(WIN32)

这里可将target_sources一行省略,直接在add_executable中添加rc文件也可达到一样的效果。

效果

最终效果

参考链接

引用微软自家中文文档:

  1. VarFileInfo BLOCK 语句:https://docs.microsoft.com/zh-cn/windows/win32/menurc/varfileinfo-block
  2. StringFileInfo BLOCK 语句:https://docs.microsoft.com/zh-cn/windows/win32/menurc/stringfileinfo-block
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小涛29

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值