要点:
全程只用 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
参数说明重点
-cmake-generator "Ninja Multi-Config":核心! 一个 build 目录同时编译 Debug + Release,不用两次 configure。-static-runtime:Qt Debug / Release 全部使用 MT(静态 CRT),和 OpenSSL 保持一致。- 全程 x64 终端,不会生成任何 32 位目标文件。
OPENSSL_ROOT_DIR_RELEASE / OPENSSL_ROOT_DIR_DEBUG:CMake 会自动根据构建配置选用对应 OpenSSL 库。- 去掉了
-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. 校验要点
- 所有产物都是 x64,没有任何 32 位 obj/lib/exe;用
dumpbin /headers xxx.lib 查看机器类型是 x64。 - Debug 版 exe:内置 OpenSSL debug 静态库,带调试信息,无外部 dll。
- Release 版 exe:内置 OpenSSL release 静态库,LTO 优化,无外部 dll。
dumpbin /dependents your_app.exe,不能看到 libssl-3.dll/libcrypto-3.dll。
7. 常见坑
- ❌ 不要混用 x64 和 x86 终端:一旦打开 x86 VS 终端,会生成 32 位目标,直接符号冲突。全程只使用 x64 Native Tools Command Prompt for VS2026。
- ❌ Multi-Config 模式下不能写
-debug 或 -release 在 configure.bat 参数里,会报错。 - ❌ Debug OpenSSL 和 Release OpenSSL 不能混用链接,CMake 会自动区分,前提是正确设置
OPENSSL_ROOT_DIR_RELEASE / OPENSSL_ROOT_DIR_DEBUG。 - ❌ CRT 匹配:Debug 项目必须链接 MTd,Release 链接 MT;上面 CMake
CMAKE_MSVC_RUNTIME_LIBRARY 已经写好自动切换。