安装MSYS2、更新系统(clang64)
MSYS2 是 Minimal SYStem 2 的缩写,参考:https://www.msys2.org/wiki/History/
安装:https://www.msys2.org/ , 默认目录 C:\msys64, 默认环境: UCRT64, 具体参考: https://www.msys2.org/docs/environments/
目标环境:CLANG64
- Toolchain:llvm
- Architecture:x86_64
- C Library:ucrt
- C++ Library:libc++
打开 msys2 clang64终端, 设置msys2国内仓库,参考: https://mirrors.tuna.tsinghua.edu.cn/help/msys2/
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
更新环境:
pacman -Syu
更新后关闭终端,再次打开执行:
pacman -Su
- MSYS2使用Arch Linux的包管理器pacman进行包管理。但MSYS2不是一个虚拟机,它只是用了Linux的包管理器。MSYS2是用来编译,使用native Windows程序的。
- pacman -Syu分两部分看。-Sy是更新软件库,u是升级所以已经安装的包
- pacman -S 是安装
安装C++工具链
安装 Clang64 工具链:运行以下命令安装包含 Clang、C++ 标准库以及 Make 等的基础工具包:
pacman -S mingw-w64-clang-x86_64-toolchain mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-ninja
:: There are 26 members in group mingw-w64-clang-x86_64-toolchain:
:: Repository clang64
1) mingw-w64-clang-x86_64-clang 2) mingw-w64-clang-x86_64-clang-21 3) mingw-w64-clang-x86_64-clang-analyzer
4) mingw-w64-clang-x86_64-clang-libs 5) mingw-w64-clang-x86_64-clang-tools-extra
6) mingw-w64-clang-x86_64-compiler-rt 7) mingw-w64-clang-x86_64-compiler-rt-21 8) mingw-w64-clang-x86_64-crt
9) mingw-w64-clang-x86_64-headers 10) mingw-w64-clang-x86_64-libc++ 11) mingw-w64-clang-x86_64-libmangle
12) mingw-w64-clang-x86_64-libunwind 13) mingw-w64-clang-x86_64-libwinpthread 14) mingw-w64-clang-x86_64-lld
15) mingw-w64-clang-x86_64-lld-21 16) mingw-w64-clang-x86_64-lldb 17) mingw-w64-clang-x86_64-llvm
18) mingw-w64-clang-x86_64-llvm-21 19) mingw-w64-clang-x86_64-llvm-libs 20) mingw-w64-clang-x86_64-llvm-openmp
21) mingw-w64-clang-x86_64-llvm-tools 22) mingw-w64-clang-x86_64-make 23) mingw-w64-clang-x86_64-pkgconf
24) mingw-w64-clang-x86_64-tools 25) mingw-w64-clang-x86_64-winpthreads
26) mingw-w64-clang-x86_64-winstorecompat
检查版本:
clang --version
clang++ --version
cmake --version
ninja --version
输出:
clang version 22.1.4 (https://github.com/msys2/MINGW-packages 42681e05ad3617c25e48a935a48eddc72a3ac7e2)
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:/msys64/clang64/bin
clang version 22.1.4 (https://github.com/msys2/MINGW-packages 42681e05ad3617c25e48a935a48eddc72a3ac7e2)
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:/msys64/clang64/bin
cmake version 4.3.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
1.13.2
clion 设置
Settings → Build, Execution, Deployment → Toolchains
- 工具集:C:\msys64\clang64
- cmake:C:\msys64\clang64\bin\cmake.exe
- 构建工具:C:\msys64\clang64\bin\ninja.exe
- c编译器:C:\msys64\clang64\bin\cc.exe
- c++编译器:C:\msys64\clang64\bin\c++.exe
- 调试器: C:\msys64\clang64\bin\lldb.exe
在CLion中生成单一独立可执行文件(不依赖外部动态库)需要结合编译器/链接器配置和打包工具,cmake配置文件通用版本:
# 静态链接配置
if(MSVC)
# MSVC静态链接
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
elseif(CMAKE_COMPILER_IS_GNUCXX)
# GCC静态链接
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# Clang静态链接(需安装静态库)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
endif()
中文乱码:源码使用 GB18030
qt6
1、安装 Qt6 和相关开发组件
pacman -S mingw-w64-clang-x86_64-qt6 mingw-w64-clang-x86_64-qt6-base mingw-w64-clang-x86_64-qt6-tools
:: There are 39 members in group mingw-w64-clang-x86_64-qt6:
:: Repository clang64
1) mingw-w64-clang-x86_64-qt6-3d 2) mingw-w64-clang-x86_64-qt6-5compat 3) mingw-w64-clang-x86_64-qt6-activeqt
4) mingw-w64-clang-x86_64-qt6-base 5) mingw-w64-clang-x86_64-qt6-charts
6) mingw-w64-clang-x86_64-qt6-connectivity 7) mingw-w64-clang-x86_64-qt6-datavis3d
8) mingw-w64-clang-x86_64-qt6-declarative 9) mingw-w64-clang-x86_64-qt6-doc
10) mingw-w64-clang-x86_64-qt6-graphs 11) mingw-w64-clang-x86_64-qt6-grpc
12) mingw-w64-clang-x86_64-qt6-httpserver 13) mingw-w64-clang-x86_64-qt6-imageformats
14) mingw-w64-clang-x86_64-qt6-languageserver 15) mingw-w64-clang-x86_64-qt6-location
16) mingw-w64-clang-x86_64-qt6-lottie 17) mingw-w64-clang-x86_64-qt6-mqtt
18) mingw-w64-clang-x86_64-qt6-multimedia 19) mingw-w64-clang-x86_64-qt6-networkauth
20) mingw-w64-clang-x86_64-qt6-pdf 21) mingw-w64-clang-x86_64-qt6-positioning
22) mingw-w64-clang-x86_64-qt6-quick3d 23) mingw-w64-clang-x86_64-qt6-quick3dphysics
24) mingw-w64-clang-x86_64-qt6-quickeffectmaker 25) mingw-w64-clang-x86_64-qt6-quicktimeline
26) mingw-w64-clang-x86_64-qt6-remoteobjects 27) mingw-w64-clang-x86_64-qt6-scxml
28) mingw-w64-clang-x86_64-qt6-sensors 29) mingw-w64-clang-x86_64-qt6-serialbus
30) mingw-w64-clang-x86_64-qt6-serialport 31) mingw-w64-clang-x86_64-qt6-shadertools
32) mingw-w64-clang-x86_64-qt6-speech 33) mingw-w64-clang-x86_64-qt6-svg 34) mingw-w64-clang-x86_64-qt6-tools
35) mingw-w64-clang-x86_64-qt6-translations 36) mingw-w64-clang-x86_64-qt6-virtualkeyboard
37) mingw-w64-clang-x86_64-qt6-webchannel 38) mingw-w64-clang-x86_64-qt6-websockets
39) mingw-w64-clang-x86_64-qt6-webview
将 C:\msys64\clang64\bin ,C:\msys64\clang64\share\qt6\bin 加入系统path
2、 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 报错的解决方式:
设置环境变量 QT_QPA_PLATFORM_PLUGIN_PATH , 值为:C:\msys64\clang64\share\qt6\plugins\platforms
重启clion
3、新建项目
新建Qt 微件可执行项目,Qt CMake前缀: C:\msys64\clang64\bin, 对应cmake文件钟的下面语句
set(CMAKE_PREFIX_PATH "C:/msys64/clang64/bin")
4、外部工具:
设置,工具,外部工具
- 名称:UI_Designer
- 程序
C:\msys64\clang64\bin\designer.exe - 实参:
$FileName$ - 工作目录:
$FileDir$
设置,工具,外部工具
- 名称:UIC,用户界面编译器
- 程序:C:\msys64\clang64\share\qt6\bin\uic.exe
- 实参:
$FileName$ -o ui_$FileNameWithoutExtension$.h - 工作目录:
$FileDir$
项目,新建,Qt UI 类,如 MainWindow,就可以在项目中的ui上右键,ExternalTool,UI_Designer来打开图形界面(双击也是OK的)。
生成头文件: mainwindow.h
需要修改 main.cpp 使用自己创建的Widget组件
main.cpp 原始代码:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QPushButton button("Hello world!", nullptr);
button.resize(200, 100);
button.show();
return QApplication::exec();
}
修改后代码:
#include "mainwindow.h"
#include "ui_MainWindow.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow m;
m.show();
return QApplication::exec();
}
打包qt6程序:
- 新建目录,如
打包, 将生成的exe拷贝到该目录下 - 在该目录下运行
windeployqt xxx.exe --force
--force, 通过添加强制覆盖参数–force强制覆盖已存在的文件
打包时去掉命令行黑框:使用 CMake(Qt6 默认推荐)在你的 CMakeLists.txt 文件中,找到 add_executable 这一行,在目标名称后面加上 WIN32 关键字:
add_executable(你的项目名称 WIN32 main.cpp mainwindow.cpp)
警告提示: Warning: Cannot find any version of the dxcompiler.dll and dxil.dll., 处理方案:
- 忽略警告
- 将包含这两个dll 的
C:\JetBrains\CLion\jbr\bin加入系统path, 不过这样打包多两个dll 会多出近30 MB左右
boost库
安装:
pacman -S mingw-w64-clang-x86_64-boost
高精度浮点数测试:
#include <iostream>
#include <limits>
#include <boost/multiprecision/cpp_bin_float.hpp>
using f128 = boost::multiprecision::cpp_bin_float_quad;
using namespace std;
int main() {
// 1. 验证位宽 (8字节 * 8位 = 64位)
std::cout << "double 占用字节数: " << sizeof(double) << " 字节 ("
<< sizeof(double) * 8 << " 位)\n";
// 2. 验证二进制有效尾数 (对应 53 位)
std::cout << "二进制尾数位数 : " << std::numeric_limits<double>::digits << " 位\n";
// 3. 验证十进制安全位数 (对应 15 位)
std::cout << "十进制保证精度 : " << std::numeric_limits<double>::digits10 << " 位\n";
// 1. 验证位宽
std::cout << "f128 占用字节数: " << sizeof(f128) << " 字节 ("
<< sizeof(double) * 8 << " 位)\n";
// 2. 验证二进制有效尾数
std::cout << "二进制尾数位数 : " << std::numeric_limits<f128>::digits << " 位\n";
// 3. 验证十进制安全位数
std::cout << "十进制保证精度 : " << std::numeric_limits<f128>::digits10 << " 位\n";
return 0;
}
输出:
double 占用字节数: 8 字节 (64 位)
二进制尾数位数 : 53 位
十进制保证精度 : 15 位
f128 占用字节数: 32 字节 (64 位)
二进制尾数位数 : 113 位
十进制保证精度 : 33 位
- double 十进制保证精度 : 15 位
- boost库的
boost::multiprecision::cpp_bin_float_quad十进制保证精度 : 33 位
fmt库
安装:
pacman -S mingw-w64-clang-x86_64-fmt