基于 vcpkg 与 LLVM-MinGW 的 Qt6 静态链接开发方案

环境准备

在执行下面的操作之前,请确保已经安装下列开发必要的工具。建议统一放在 ~/tools 目录下,并将其加入系统环境变量:


安装与配置 vcpkg

打开命令行(CMD),建议在当前用户的 tools 文件夹下执行以下命令来获取并安装 vcpkg:

cmd 复制代码
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
bootstrap-vcpkg.bat

提示: 新版的 vcpkg 不再本地编译自己,而是直接下载官方发布版到本目录。您会看到类似如下的输出: Downloading [https://github.com/microsoft/vcpkg-tool/releases/download/2026-04-08/vcpkg.exe](https://github.com/microsoft/vcpkg-tool/releases/download/2026-04-08/vcpkg.exe) -> C:\Users\touken\tools\vcpkg\vcpkg.exe

在 Windows 的"编辑环境变量"图形界面中:

  1. 先新建 VCPKG_ROOT
    在"用户变量"里点击"新建",变量名填 VCPKG_ROOT,变量值填 C:\Users\touken\tools\vcpkg
  2. PATH 里直接引用它
    找到并双击打开用户变量里的 Path,点击"新建",直接填入 %VCPKG_ROOT%

(注:设置完环境变量后,建议重新打开您的命令行终端或 IDE 以使其生效。)


初始化项目

首先,在您的项目根目录下使用以下命令创建 vcpkg.jsonvcpkg-configuration.json

复制代码
vcpkg new --application

通常我们可以使用 vcpkg add port <包名> 来添加包,但由于我们明确只需要 Qt 的 GUI 相关包,可以直接手动编辑vcpkg.json配置。


json 复制代码
{
  "dependencies": [
    {
      "name": "qtbase",
      "default-features": false,
      "features": [
        "gui",
        "widgets"
      ]
    }
  ]
}

接下来,创建 CMake 配置CMakeLists.txt文件,用于组织和编译项目。

cmake 复制代码
cmake_minimum_required(VERSION 3.21)
project(sandbox LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_AUTOMOC ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)

add_executable(sandbox WIN32 src/main.cpp)

target_link_libraries(sandbox PRIVATE Qt6::Widgets)

src/main.cpp编写一个基础的 Qt GUI 示例代码。


C++ 复制代码
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QPushButton button("Hello Qt6 + vcpkg");
  button.resize(320, 120);
  button.show();

  return app.exec();
}

现代 CMake 官方推荐将工具链、Triplet、编译器等底层配置全部集中写进CMakePresets.json预设文件中。


json 复制代码
{
    "version": 6,
    "configurePresets": [
        {
            "name": "base",
            "hidden": true,
            "generator": "Ninja",
            "cacheVariables": {
                "CMAKE_C_COMPILER": "clang",
                "CMAKE_CXX_COMPILER": "clang++",
                "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
                "VCPKG_TARGET_TRIPLET": "x64-mingw-static"
            }
        },
        {
            "name": "debug",
            "displayName": "LLVM MinGW + vcpkg (Debug)",
            "inherits": "base",
            "binaryDir": "${sourceDir}/build-debug",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
            }
        },
        {
            "name": "release",
            "displayName": "LLVM MinGW + vcpkg (Release)",
            "inherits": "base",
            "binaryDir": "${sourceDir}/build-release",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Release",
                "CMAKE_CXX_FLAGS": "-static-libstdc++ -static-libgcc",
                "CMAKE_EXE_LINKER_FLAGS": "-static -static-libstdc++ -static-libgcc"
            }
        }
    ],
    "buildPresets": [
        {
            "name": "debug",
            "configurePreset": "debug"
        },
        {
            "name": "release",
            "configurePreset": "release"
        }
    ]
}

编译项目

所有配置准备就绪后,在项目根目录下依次执行以下命令,通过预设好的 release 配置进行项目构建:

cmd 复制代码
# 配置项目
cmake --preset release

# 编译项目
cmake --build --preset release

代码提示与格式化

为了在 VS Code 中获得丝滑的代码跳转和智能提示(IntelliSense),推荐使用 clangd 插件代替微软官方的 C/C++ 插件。

由于我们在 CMakePresets.json 中开启了 CMAKE_EXPORT_COMPILE_COMMANDS,CMake 会在 build-debug目录下生成 compile_commands.json。我们需要告知 clangd 读取该文件以识别 Qt 的头文件路径。

在项目根目录下创建 .vscode/settings.json,配置如下:

json 复制代码
{
    // 禁用微软官方 C/C++ 插件的 IntelliSense,防止与 clangd 冲突
    "C_Cpp.intelliSenseEngine": "disabled",

    // 配置 clangd 启动参数
    "clangd.arguments": [
        // 指向编译数据库所在目录
        "--compile-commands-dir=${workspaceFolder}/build-debug",
        // 后台自动分析文件并建立索引(推荐开启)
        "--background-index",
        // 启用 clang-tidy 静态代码检查,实时发现潜在错误
        "--clang-tidy",
        // 智能头文件插入策略:按需自动补充 #include
        "--header-insertion=iwyu",
        // 允许 clangd 使用 4 个并行工作线程(根据你的 CPU 核心数调整)
        "-j=4"
    ]
}

clangd 内置了强大的格式化引擎。通过在项目根目录下放置 .clang-format 文件,可以确保团队开发环境下的代码风格高度统一。

以下是一份适配现代 C++ 开发习惯的推荐配置(4 空格缩进,不强制列宽限制):

yaml 复制代码
Language: Cpp
# 基础风格
BasedOnStyle: Google
IndentWidth: 4
TabWidth: 4
UseTab: Never
ColumnLimit: 0 # 不限制单行长度,由开发者自行判断换行

# 访问修饰符(public/private)缩进
AccessModifierOffset: -4

# 括号与空格
Standard: Auto
Cpp11BracedListStyle: true
SpacesInContainerLiterals: true
SpaceBeforeParens: ControlStatements
SpaceAfterTemplateKeyword: true

# 指针对齐方式(靠右:int *ptr)
PointerAlignment: Right
DerivePointerAlignment: false

# 代码块换行策略
BreakBeforeBraces: Custom
BraceWrapping:
  AfterClass: false
  AfterControlStatement: false
  AfterEnum: false
  AfterFunction: false
  AfterNamespace: false
  AfterStruct: false
  BeforeElse: false
  IndentBraces: false

# 允许短代码单行显示
AllowShortBlocksOnASingleLine: true
AllowShortIfStatementsOnASingleLine: true
AllowShortFunctionsOnASingleLine: None

# 模板与命名空间
AlwaysBreakTemplateDeclarations: true
CompactNamespaces: true
NamespaceIndentation: None

# 包含文件排序
SortIncludes: false

提示 :配置完成后,建议在 VS Code 中执行 Clangd: Restart language server 确保配置立即生效。现在,你可以享受毫秒级的代码补全和 Alt + Shift + F 一键美化代码的快感了。

总结

本方案通过 vcpkg 自动化管理 Qt6 复杂依赖,结合 LLVM-MinGW 实现 Windows 下的现代化编译。通过 CMake Presets 确保了配置的可移植性,并通过 clangd 提供了丝滑的编码体验。最终实现的静态链接发布方式,极大地简化了 Qt 应用的分发成本。

相关推荐
睡一觉就好了。1 小时前
C++11(一)
c++
水云桐程序员1 小时前
C++的主要应用场景
c++·学习方法
无心水1 小时前
【Hermes:Skill系统深度】21、Skill 调试与冲突解决:为什么没触发?怎么修复? —— Honcho 智能体排障完全手册
人工智能·windows·openclaw·养龙虾·hermes·养马·honcho
Ulyanov1 小时前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》 开发环境搭建与工具链极简主义 —— 拒绝臃肿,构建工业级基座
开发语言·python·qt·ui·架构·系统仿真
叼烟扛炮2 小时前
C++第一讲:C++ 入门基础
开发语言·c++·函数重载·引用·内联函数·nullptr
Python私教2 小时前
FuturesDesk 集成 OMC 多智能体编排提效
人工智能·windows·开源
zh_xuan2 小时前
使用libcurl调用http接口
c++·github·libcurl
zh路西法2 小时前
【RDKX5多摄像头模型推理】USB带宽限制与ROS2话题零拷贝转发
linux·c++·python·深度学习
千寻girling3 小时前
五一劳动节快乐 [特殊字符][特殊字符][特殊字符]
java·c++·git·python·学习·github·php