C++编程环境:win64,msys2,clang64

安装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

正文完
 0
评论(没有评论)