Windows11下VS2026静态编译Qt6.X+OpenSSL3.X的x64-only

xingyun86 15小时前 22

要点:

全程只用 x64 Native Tools Command Prompt for VS2026,全程不碰 x86 终端;

configure 一次配置同时生成 Debug & Release;只编译 x64,完全跳过 32 位。 

方案:MT 静态 CRT、内置静态 OpenSSL 3.x、QtNetwork、PMv2 DPI

 环境:VS2022,Ninja,CMake,StrawberryPerl,NASM;所有源码目录无中文空格。


1. 先编译 OpenSSL 3.x:只编译 x64,同时准备 Debug/Release OpenSSL 静态库

OpenSSL 默认一次只能编译一种配置,所以要分别编译 OpenSSL x64 Debug、OpenSSL x64 Release两个独立目录。 两个 OpenSSL:

  • D:\openssl_src
  • D:\openssl_install_release(MT Release libssl.lib + libcrypto.lib)
  • D:\openssl_install_debug(MT Debug libssl.lib + libcrypto.lib)

编译 OpenSSL Release(x64 MT)

打开 x64 Native Tools Command Prompt for VS2026

cd D:\openssl_src
perl Configure VC-WIN64A no-shared --prefix=D:\openssl_install_release
nmake clean
nmake
nmake install_sw

编译 OpenSSL Debug(x64 MT)

cd D:\openssl_src
perl Configure VC-WIN64A no-shared debug --prefix=D:\openssl_install_debug
nmake clean
nmake
nmake install_sw

debug 参数会生成带调试信息的 MT 静态 OpenSSL 库,专门给 Qt Debug 版本链接。

⚠️ OpenSSL debug 库不要拿来链接 release 程序,反之亦然,否则链接报错。

2. Qt6 configure 命令(一次构建同时产出 Debug + Release,仅 x64)

Qt6 使用 CMake 后端,支持 Multi-Config(Ninja Multi-Config),一个 build 目录同时产出 Debug、Release 两套静态 Qt 库,不用分开两个 build 目录。 关键:不需要 -release / -debug 单独参数;用 -cmake-generator Ninja Multi-Config

源码目录:D:\qt6_static_src\qt6构建目录:D:\qt6_static_build_x64(只 x64) 安装目录:D:\qt6_static_install_x64

:: 清空旧构建目录(重要,防止残留)
rmdir /s /q D:\qt6_static_build_x64
mkdir D:\qt6_static_build_x64
cd D:\qt6_static_build_x64

D:\qt6_static_src\qt6\configure.bat ^
-static ^
-static-runtime ^
-prefix D:\qt6_static_install_x64 ^
-platform win32-msvc ^
-cmake-generator "Ninja Multi-Config" ^
-submodules qtbase qtdeclarative qtsvg qttools qtshadertools qtnetwork ^
-skip qtwebengine -skip qtmultimedia -skip qtactiveqt ^
-openssl-linked ^
-no-schannel ^
-D QT_BUILD_TESTS=OFF ^
-D QT_BUILD_EXAMPLES=OFF ^
-D CMAKE_INTERPROCEDURAL_OPTIMIZATION=ON ^
-- ^
-D OPENSSL_ROOT_DIR_RELEASE=D:\openssl_install_release ^
-D OPENSSL_ROOT_DIR_DEBUG=D:\openssl_install_debug ^
-D OPENSSL_USE_STATIC_LIBS=ON ^
-D OPENSSL_MSVC_STATIC_RT=ON

参数说明重点

  1. -cmake-generator "Ninja Multi-Config"核心! 一个 build 目录同时编译 Debug + Release,不用两次 configure。
  2. -static-runtime:Qt Debug / Release 全部使用 MT(静态 CRT),和 OpenSSL 保持一致。
  3. 全程 x64 终端,不会生成任何 32 位目标文件。
  4. OPENSSL_ROOT_DIR_RELEASE / OPENSSL_ROOT_DIR_DEBUG:CMake 会自动根据构建配置选用对应 OpenSSL 库。
  5. 去掉了 -release 参数!因为 Multi-Config 模式下不能指定单独 release/debug。

configure 成功日志要看到:

OpenSSL ...................... yes
Qt directly linked to OpenSSL .. yes

3. 编译(同时编译 Debug 和 Release)

cd D:\qt6_static_build_x64
:: 编译Release
ninja -j12 Release
:: 编译Debug
ninja -j12 Debug

你可以一次性:ninja -j12 all,同时编译 Debug+Release。

编译完成执行 install,会把两套库安装到 prefix 目录下,自动分目录:

ninja install

安装后目录结构:

D:\qt6_static_install_x64
├─ bin
│  ├─ debug
│  └─ release
├─ lib
│  ├─ debug
│  └─ release
└─ include

4. 你的项目 CMakeLists.txt(自动选择 Qt Debug/Release,x64 only,MT,PMv2)

cmake_minimum_required(VERSION 3.20)
project(qt_ssl_demo)
set(CMAKE_CXX_STANDARD 17)

# 强制MT静态CRT,Debug/Release都MT
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

# 指定我们编译好的x64-only静态Qt
set(CMAKE_PREFIX_PATH "D:/qt6_static_install_x64")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network)

qt_standard_project_setup()

qt_add_executable(qt_ssl_demo
    main.cpp
    app.manifest
)

target_link_libraries(qt_ssl_demo PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network)

# 静态Qt插件注册
qt_import_plugins(qt_ssl_demo INCLUDE Qt6::QWindowsIntegrationPlugin)

app.manifest 不变,依旧是 PMv2 高分 DPI。

main.cpp:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QSslSocket>
#include <QDebug>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << "SSL enable:" << QSslSocket::supportsSsl();
    qDebug() << "SSL Version:" << QSslSocket::sslLibraryVersionString();
    QWidget w;
    w.resize(400,300);
    QPushButton btn("Test SSL",&w);
    w.show();
    return a.exec();
}

5. 构建你的项目(Debug & Release)

mkdir build
cd build
D:\qt6_static_install_x64\bin\qt-cmake .. -G "Ninja Multi-Config"
ninja Release
ninja Debug

6. 校验要点

  1. 所有产物都是 x64,没有任何 32 位 obj/lib/exe;用 dumpbin /headers xxx.lib 查看机器类型是 x64
  2. Debug 版 exe:内置 OpenSSL debug 静态库,带调试信息,无外部 dll。
  3. Release 版 exe:内置 OpenSSL release 静态库,LTO 优化,无外部 dll。
  4. dumpbin /dependents your_app.exe不能看到 libssl-3.dll/libcrypto-3.dll

7. 常见坑

  1. ❌ 不要混用 x64 和 x86 终端:一旦打开 x86 VS 终端,会生成 32 位目标,直接符号冲突。全程只使用 x64 Native Tools Command Prompt for VS2026
  2. ❌ Multi-Config 模式下不能写 -debug-release 在 configure.bat 参数里,会报错。
  3. ❌ Debug OpenSSL 和 Release OpenSSL 不能混用链接,CMake 会自动区分,前提是正确设置 OPENSSL_ROOT_DIR_RELEASE / OPENSSL_ROOT_DIR_DEBUG
  4. ❌ CRT 匹配:Debug 项目必须链接 MTd,Release 链接 MT;上面 CMake CMAKE_MSVC_RUNTIME_LIBRARY 已经写好自动切换。


×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回