ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

配置 Qt 开发环境

配置 Qt 开发环境

文章目录

  • 官方下载
  • 配置 Windows 开发环境
    • 配置 Qt6.7.3 + vs2019
  • 配置 Ubuntu 开发环境
  • 配置 MacOS 开发环境
    • 创建开发者证书和发布证书
    • 安装 Xcode
    • 安装 Qt
    • 创建项目(CMake)
    • 开发和发布证书
    • 添加应用程序图标
    • 拷贝依赖库
    • 签名
    • 打包 (.dmg)
      • 安装 Homebrew
      • 制作.app生成.dmg脚本
    • 公证
    • 注意事项

官方下载

Qt 官方提供在线安装器(Online Installer),通过它可以按需勾选 Qt 版本、编译套件和附加模块,相比离线包体积更小、升级也更方便。
需要在 Qt 注册免费账号:https://login.qt.io/register
在线安装地址:https://download.qt.io/official_releases/online_installers/

配置 Windows 开发环境

配置 Qt6.7.3 + vs2019

https://visualstudio.microsoft.com/zh-hans/downloads/ 下载 Visual Studio 2026 生成工具 - 勾选 vs2019 相关的 c++ 库
鼠标双击 vs_BuildTools.exe

鼠标双击在线安装器,登录账号后, 选择 Qt 6.7.3

配置 Ubuntu 开发环境

直接安装
./qt-online-installer-macOS-x64-4.10.0 --mirror https://mirrors.cloud.tencent.com/qt/

配置 MacOS 开发环境

创建开发者证书和发布证书

注:只有开发者账号主体才能创建 Apple Developer ID
创建 Apple Developer ID 时需要选择一个macOS电脑创建的证书,从钥匙串,证书中创建一个本地证书然后上传即可。

安装 Xcode

App Store 中搜索直接安装

安装 Qt

MacOS 在线安装 Qt 加速方式,从官网下载 qt-online-installer-macOS-x64

seer@seerdeMac-mini qt-online-installer-macOS-x64-4.10.0.app%cd Contents seer@seerdeMac-mini Contents%ls _CodeSignature Info.plist MacOS PkgInfo Resources seer@seerdeMac-mini Contents%cd MacOS seer@seerdeMac-mini MacOS%ls qt-online-installer-macOS-x64-4.10.0seer@seerdeMac-mini MacOS%./qt-online-installer-macOS-x64-4.10.0--mirror https://mirrors.cloud.tencent.com/qt/

创建项目(CMake)

加上 MACOSX_BUNDLE

if(APPLE)# 添加图标 - 设置图标文件路径set(APP_ICON"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/appImages/logo.icns")add_executable(${PROJECT_NAME}MACOSX_BUNDLE${SOURCES}${HEADERS}${FORMS}${APP_ICON})# 设置macOS Bundle属性set_target_properties(${PROJECT_NAME}PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER"com.seer.appName"MACOSX_BUNDLE_BUNDLE_VERSION"1.0.0.0"MACOSX_BUNDLE_SHORT_VERSION_STRING"1.0"MACOSX_BUNDLE_ICON_FILE"logo.icns"MACOSX_BUNDLE_BUNDLE_NAME"appName"MACOSX_BUNDLE TRUE MACOSX_RPATH ON)# 设置图标文件属性set_source_files_properties(${APP_ICON}PROPERTIES MACOSX_PACKAGE_LOCATION"Resources")else()add_executable(${PROJECT_NAME}WIN32${SOURCES}${HEADERS}${FORMS}ICO.rc)endif()

开发和发布证书

如果有开发者账号(充值后的)
可以使用命令查看

seer@seerdeMac-mini createDmg % security find-identity-v-pcodesigning1)BB56D563567D2E884B45B28D065EEBBE93EB719B"Apple Development: 419087137@qq.com (******)"2)6EF78D6AD917CDE506F1108B971CBC437ED1C2F4"Apple Development: 长泉 胡 (******)"5)38EAB8D9D02854BD66AEB84B7F699EC0ADB3A43D"Developer ID Application: Shanghai ****** Technology Co., Ltd. (******)"5valid identities found
#只有开发者账号主体才能创建 Apple Developer ID发布的 Apple Developer ID 就是"Developer ID Application: Shanghai ****** Technology Co., Ltd. (******)"

创建 Apple Developer ID 需要 macOS 电脑上钥匙串访问->证书助理->从证书颁发机构请求证书->保存到硬盘
CertSigningRequest.certSigningRequest 在apple开发者证书网页上传该文件即可。

添加应用程序图标

准备一个 .icns格式的图标文件。如果没有可以找一张 .png 使用命令行生成
generate_icons.sh 把 logo.png 生成 logo.icons 脚本

#!/bin/bash# 删除现有图标集文件夹(如果存在)if[-d"logo.iconset"];thenrm-rflogo.iconsetfi# 创建新的图标集文件夹mkdirlogo.iconset# 检查原始图标文件是否存在if[!-f"logo.png"];thenecho"错误: 请确保当前目录下存在 logo.png 文件"exit1fi# 生成不同尺寸的图标文件sips-z1616logo.png--outlogo.iconset/icon_16.png sips-z1616logo.png--outlogo.iconset/icon_16@2x.png sips-z3232logo.png--outlogo.iconset/icon_32.png sips-z3232logo.png--outlogo.iconset/icon_32@2x.png sips-z6464logo.png--outlogo.iconset/icon_64.png sips-z6464logo.png--outlogo.iconset/icon_64@2x.png sips-z128128logo.png--outlogo.iconset/icon_128.png sips-z128128logo.png--outlogo.iconset/icon_128@2x.png sips-z256256logo.png--outlogo.iconset/icon_256.png sips-z256256logo.png--outlogo.iconset/icon_256@2x.png sips-z512512logo.png--outlogo.iconset/icon_512.png sips-z512512logo.png--outlogo.iconset/icon_512@2x.png# 生成.icns文件iconutil-cicns logo.iconsetecho"图标集创建完成,生成了 logo.icns 文件"

拷贝依赖库

注意资源和配置文件只能放到.app/Contents/Resources目录中,否则签名过不了

其中 Contents/MacOS/中就有你生成的 appName (unix执行文件)
把 Qt 依赖库加到 .app 中, 如果发现部分 .dylib 没有拷贝到 .app/Contents/Frameworks,下面的指令再执行一次
如果按上述 CMake 项目,logo.icns 在包的 .app/Contents/Resources/appImages/logo.icns

自动拷贝依赖库脚本 macdeployqt_1.sh

#!/bin/bashMacdeployqt_Dir="/Users/seer/Desktop/hu/Qt/6.7.3/6.7.3/macos/bin/macdeployqt"APP_PATH="../appName.app"#替换成真实的# 安全拷贝文件夹函数# 参数1: 源文件夹路径# 参数2: 目标文件夹路径copy_folder_safe(){localsource_dir="$1"localtarget_dir="$2"# 检查参数if[-z"$source_dir"]||[-z"$target_dir"];thenecho"❌ 错误: 需要提供源文件夹和目标文件夹路径"echo"用法: copy_folder_safe <源文件夹> <目标文件夹>"return1fi# 检查源文件夹是否存在if[!-d"$source_dir"];thenecho"❌ 错误: 源文件夹不存在:$source_dir"return1fi# 如果目标文件夹存在,则删除if[-d"$target_dir"];thenecho"⚠️ 目标文件夹已存在,正在删除:$target_dir"rm-rf"$target_dir"if[$?-ne0];thenecho"❌ 错误: 无法删除目标文件夹:$target_dir"return1fifi# 创建目标文件夹的父目录(如果不存在)mkdir-p"$(dirname"$target_dir")"# 执行拷贝echo"📋 正在拷贝文件夹..."cp-R"$source_dir""$target_dir"if[$?-eq0];thenecho"✅ 文件夹拷贝成功:$source_dir->$target_dir"return0elseecho"❌ 文件夹拷贝失败"return1fi}# 函数:copy文件copy_files(){#拷贝额外的文件夹#copy_folder_safe "../appImages" "${APP_PATH}/Contents/Resources/appImages"#copy_folder_safe "../appInfo" "${APP_PATH}/Contents/Resources/appInfo"#copy_folder_safe "../RoPlugins" "${APP_PATH}/Contents/MacOS/RoPlugins"echo"正在执行 macdeployqt..."${Macdeployqt_Dir}${APP_PATH}}# 主流程main(){# 文件copy_files}# 执行主函数main

签名

制作签名脚本 codesign_2.sh

#!/bin/bash# macOS 应用签名工具# 功能:自动清理无效文件 + 分层签名 .dylib, .framework, .app# ===== 配置区 =====CERT_ID="Developer ID Application: Shanghai ****** Technology Co., Ltd. (******)"APP_PATH="../appName.app"#http://timestamp.digicert.comTIMESTAMP_SERVER=""# ==================# 函数:带颜色输出error_echo(){echo-e"\033[31m❌$1\033[0m";}success_echo(){echo-e"\033[32m✅$1\033[0m";}step_echo(){echo-e"\033[34m🔧$1\033[0m";}# 函数:检查网络连通性check_timestamp_server(){if!curl--connect-timeout10-sI"$TIMESTAMP_SERVER"|grep-q"HTTP/.* 400";thenerror_echo"时间戳服务器不可达"return1fireturn0}# 函数:签名操作sign_target(){localtarget="$1"step_echo"签名:$(basename"$target")"codesign-s"$CERT_ID"\--optionsruntime\--timestamp\-f\"$target"||return1# 验证签名if!codesign-vvv"$target"&>/dev/null;thenerror_echo"签名验证失败:$target"return1fireturn0}# 函数:清理无效文件clean_invalid_files(){return0}# 主流程main(){# 检查证书if!security find-identity-pcodesigning|grep-q"$CERT_ID";thenerror_echo"证书不存在:$CERT_ID"exit1fi# 检查时间戳服务#check_timestamp_server || {# error_echo "时间戳服务不可用 - 尝试无时间戳签名"# TIMESTAMP_SERVER=""#}# 清理无效文件clean_invalid_files# 签名动态库step_echo"签名 .dylib 文件..."find"$APP_PATH/Contents"-typef-name"*.dylib"|whileread-rfile;dosign_target"$file"||exit1done# 签名框架(特殊处理QtWebEngine)step_echo"签名 .framework..."find"$APP_PATH/Contents/Frameworks"-typed-name"*.framework"|whileread-rfw;do# 优先处理QtWebEngine内部应用if[["$fw"==*QtWebEngineCore.framework]];thensign_target"$fw/Versions/A/Helpers/QtWebEngineProcess.app"||exit1fisign_target"$fw"||exit1done# 签名主应用step_echo"签名主应用..."sign_target"$APP_PATH"||exit1# 最终验证step_echo"验证签名..."ifcodesign--verify--deep--strict"$APP_PATH";thensuccess_echo"签名验证通过"elseerror_echo"最终验证失败"exit1fi}# 执行主函数main

打包 (.dmg)

安装 Homebrew

#安装curl-fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh#安装后验证 brew 是否可用brew--version#安装create-dmgbrew install create-dmg#验证是否可用create-dmg--version

制作.app生成.dmg脚本

创建 install.sh (不要从 windows 拷贝过来)

#!/bin/bash# 定义变量APP_NAME="appName"APP_PATH="../appName.app"# 请确保此路径正确,指向实际的 .app 文件DMG_NAME="${APP_NAME}_Installer"SOURCE_FOLDER="/tmp/${APP_NAME}_dmg_source"BACKGROUND_IMG="./logo.png"# 请确保此图片文件存在VOLUME_NAME="${APP_NAME}Installer"# 名称中可包含空格# 清理并创建临时工作区echo"准备临时目录..."rm-rf"$SOURCE_FOLDER"mkdir-p"$SOURCE_FOLDER"# 关键步骤:将应用程序复制到源文件夹echo"复制应用程序..."# 请检查 APP_PATH 指向的 .app 包是否存在if[-d"$APP_PATH"];thencp-R"$APP_PATH""$SOURCE_FOLDER/"elseecho"错误:未在路径 '$APP_PATH' 找到应用程序。请检查 APP_PATH 变量。"exit1fi# 清理可能存在的旧 DMG 文件rm-f"${DMG_NAME}.dmg"# 使用 create-dmg 创建磁盘映像echo"开始创建 DMG 文件..."create-dmg\--volname"$VOLUME_NAME"\--background"$BACKGROUND_IMG"\--window-pos200120\--window-size800450\--icon-size100\--icon"appName.app"240190\--hide-extension"appName.app"\--app-drop-link550190\"${DMG_NAME}.dmg"\"$SOURCE_FOLDER"# 检查命令是否成功if[$?-eq0];thenecho"✅ DMG 文件创建成功:${DMG_NAME}.dmg"elseecho"❌ DMG 文件创建失败。"exit1fi

如果没有运行权限,可以通过
sudo chmod a+x install.sh #修改为运行权限

公证

#生成 appName.profile 凭证(只需要一次)xcrun notarytool store-credentials"appName.profile"\--apple-id"419087137@qq.com"\--team-id"团队ID"\--password"专属密码"#返回 提供的--apple-id,--team-id,--password 生成的凭证This process stores your credentials securelyinthe Keychain. You reference these credentials later using a profile name. Validating your credentials... Success. Credentials validated. Credentials saved to Keychain. To use them, specify`--keychain-profile"appName.profile"`#上传.dmg并公证seer@seerdeMac-mini createDmg % xcrun notarytool submit"appName_Installer.dmg"\--keychain-profile"appName.profile"\--wait#返回事物 id,可以根据这个 id 查询公证结果Conducting pre-submission checksforappName_Installer.dmg and initiating connection to the Apple notary service... Submission ID received id: 573638c2-0b61-43aa-b2ad-xxxxxxxxx# 使用id查询结果xcrun notarytool info 573638c2-0b61-43aa-b2ad-xxxxxxxxx --keychain-profile"appName.profile"# 确认公证成功后执行xcrun stapler staple"appName_Installer.dmg"

注意事项

如果 .app 签名失败,最好把 .app 删除重新生成, 再执行 macdeployqt ,重来一遍,否则可能有诡异的问题
手动删除 .app 一定要重新 cmake 一次,否则不会生成 .app/Contents/info.plist 文件

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进