(一)MSYS2介绍
MSYS2(Minimal SYStem 2)是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境,可以在Windows系统中编译和运行许多Linux应用程序和工具。
MSYS2基于MinGW-w64平台,提供了一个完整的开发环境,包括GCC编译器、GDB调试器、Make、Git版本控制系统和许多其他开发工具。除了常用的开发库和工具之外,MSYS2还提供了许多专门针对Windows平台的库和工具,方便开发人员进行跨平台开发和移植工作。
由于MSYS2拥有比较完整的Linux工具链和库,因此它成为了许多跨平台开发和移植项目的首选工具。另外,使用MSYS2也可以轻松地在Windows系统中搭建一个类似于Linux的软件开发环境,方便开发人员进行开发和调试工作。
(二)msys2安装
1. 安装包下载
Github 托管地址:Releases · msys2/msys2-installer (github.com)
官方仓库:Index of /distrib/ (msys2.org)
安装包有三种:
- msys2-x86_64-*.exe: GUI安装程序
- msys2-base-x86_64-*.sfx.exe: 只是自解压归档中的文件(缺少Windows集成,如 快捷方式,卸载入口,但其他工作相同)
- msys2-base-x86_64-*. tar.xz: 与.sfx.exe相同,但作为xz归档文件
注意,下载的安装程序可能会被系统识别为不安全的,放心保留即可。
2. MSYS2安装
推荐安装GUI的最新版本 (MSYS2 requires 64 bit Windows 8.1 or newer)
安装过程比较简单,不再详述,重点说下安装路径。
安装路径要求:要求卷类型为NTFS,路径只有ascii字符,没有重音,没有空格,没有符号链接,没有subst或网络驱动器,不能是FAT
(short ASCII-only path on a NTFS volume, no accents, no spaces, no symlinks, no subst or network drives, no FAT)
另外,安装时可能会被 Microsoft Defender SmartScreen 或类似的产品拦截,信任安装即可。
(三)环境/子系统
MSYS2 安装完成后,你可以看到同时安装了6子程序:
MSYS2 提供了多个子环境以支持不同架构和编译器的开发需求。以下是这六个名称所代表的不同环境及其区别:
MSYS2 CLANG64:
- 这是指使用LLVM/Clang作为编译器,面向Windows 64位系统的环境。
- 在这个环境下,你可以获得与MinGW64类似的工具链,但使用的是Clang而非GCC作为C/C++编译器。
MSYS2 CLANGARM64:
- 这是用于为ARM64(AArch64)架构编译代码的环境,同样使用Clang编译器。
- 它允许开发者在Windows系统上构建适用于ARM64架构的应用程序。
MSYS2 MINGW32:
- 这是一个面向32位Windows应用程序开发的MinGW(Minimalist GNU for Windows)环境。
- 使用GCC作为编译器,并提供了一套模拟POSIX API以便于移植Linux或其他类Unix环境下的代码到Windows 32位平台。
MSYS2 MINGW64:
- 类似于MINGW32,但针对的是64位Windows应用程序开发。
- 提供了64位版本的GCC编译器以及对应的库,同样支持POSIX兼容层。
MSYS2 MSYS:
- 这是MSYS2自带的一个基础的bash shell环境,它主要用来运行简单的Unix命令行工具和脚本。
- MSYS环境主要用于处理那些需要更接近于Linux ABI的软件包安装和维护任务,而不是直接编译Windows原生应用。
MSYS2 UCRT64:
- 这是基于Microsoft Universal CRT(通用C运行时)的一个64位环境。
- 它提供了基于最新Windows SDK和UCRT的工具链,通常是为了构建能利用现代Windows特性的应用程序,同时仍然保持与MinGW-w64一定程度上的兼容性。
这里我们选择 MSYS2 MINGW64:
(四)安装软件
打开 MSYS2 MINGW64
mingw工具链安装
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
直接回车 回车
安装完成
安装cmake 和make
安装make组件:
text
pacman -S mingw-w64-x86_64-make
安装cmake组件
text
pacman -S mingw-w64-x86_64-cmake
配置环境
搜索下 make 的路径
20021@LINUX MINGW64 ~
$ which make
/usr/bin/make
20021@LINUX MINGW64 ~
$ which cmake
/mingw64/bin/cmake
20021@LINUX MINGW64 ~
$
将· make
·路径 加入 path
C:\msys64\usr\bin
将mingw64
的bin
目录配置到环境变量Path
中。
C:\msys64\mingw64\bin
验证环境
在 windows 的 终端
执行 gcc -v
g++ -v
make -v
cmake -v
gdb -v
(更新包数据库和基础包。除非您的安装文件是最新的)
pacman -Su
其他msys2命令
MSYS2 使用 Pacman 进行软件包管理(包括 安装、更新、卸载等)
1. pacman -Suy 更新软件包
该命令会更新核心包和非核心包,核心包指MSYS2本身依赖的包(如:mintty、msys2-runtime、pacman等)
如果核心包、非核心包都需要更新,则该命令会先更新核心包,然后才能更新非核心包。更新完核心包后,会要求关闭所有已打开的终端,然后再重新执行一遍 pacman -Suy 命令,才会去更新非核心包。
2. pacman -Qs 搜索已安装的软件包
3. pacman -Ss 在所有软件包仓库中搜索
已安装的软件包,会提示 [installed]
4. pacman -S 安装软件包
5. pacman -R 卸载软件包
bash
pacman -R <name of the package>
注意,该命令仅卸载软件包,无法卸载该软件包安装时的依赖包,也无法移除该软件运行过程中产生的任何文件。
6. pacman -Sg 列出软件包
列出所有软件包组:
bash
pacman -Sg
列出某个软件包组中所有的软件包:
bash
pacman -Sg <group>
7. pacman -Q 列出已安装的软件包
列出已安装的软件包:
bash
pacman -Q
列出所有从 Arch Linux 官方软件仓库安装的软件包:
bash
pacman -Qe
8. pacman -Sw 下载软件包但不安装
bash
pacman -Sw <package>
9. pacman -U 从本地安装软件包
bash
pacman -U <packagefile.tar.zst>
支持 tar.xz,tar.zst 两种类型的归档包安装。归档包可以从这里下载:Index of / (msys2.org)
但需要注意,该本地安装方式,无法自动安装软件包的依赖,需要你自行解决依赖的软件包。
可以通过 pacman -Qi 查看依赖的软件包。
10. pacman -Qi 查看软件包详细信息
bash
pacman -Qi <package>
关于pacman命令的更多用法
可通过 pacman -h 查看
bash
$ pacman -h
usage: pacman <operation> [...]
operations:
pacman {-h --help}
pacman {-V --version}
pacman {-D --database} <options> <package(s)>
pacman {-F --files} [options] [file(s)]
pacman {-Q --query} [options] [package(s)]
pacman {-R --remove} [options] <package(s)>
pacman {-S --sync} [options] [package(s)]
pacman {-T --deptest} [options] [package(s)]
pacman {-U --upgrade} [options] <file(s)>
use 'pacman {-h --help}' with an operation for available options
通过 pacman -h 查看某个参数的更详细用法,如:
bash
$ pacman -S -h
usage: pacman {-S --sync} [options] [package(s)]
options:
-b, --dbpath <path> set an alternate database location
-c, --clean remove old packages from cache directory (-cc for all)
-d, --nodeps skip dependency version checks (-dd to skip all checks)
-g, --groups view all members of a package group
(-gg to view all groups and members)
-i, --info view package information (-ii for extended information)
-l, --list <repo> view a list of packages in a repo
-p, --print print the targets instead of performing the operation
-q, --quiet show less information for query and search
-r, --root <path> set an alternate installation root
-s, --search <regex> search remote repositories for matching strings
-u, --sysupgrade upgrade installed packages (-uu enables downgrades)
-v, --verbose be verbose
-w, --downloadonly download packages but do not install/upgrade anything
-y, --refresh download fresh package databases from the server
(-yy to force a refresh even if up to date)
--arch <arch> set an alternate architecture
--asdeps install packages as non-explicitly installed
--asexplicit install packages as explicitly installed
--assume-installed <package=version>
add a virtual package to satisfy dependencies
--cachedir <dir> set an alternate package cache location
--color <when> colorize the output
--config <path> set an alternate configuration file
--confirm always ask for confirmation
--dbonly only modify database entries, not package files
--debug display debug messages
--disable-download-timeout
use relaxed timeouts for download
--gpgdir <path> set an alternate home directory for GnuPG
--hookdir <dir> set an alternate hook location
--ignore <pkg> ignore a package upgrade (can be used more than once)
--ignoregroup <grp>
ignore a group upgrade (can be used more than once)
--logfile <path> set an alternate log file
--needed do not reinstall up to date packages
--noconfirm do not ask for any confirmation
--noprogressbar do not show a progress bar when downloading files
--noscriptlet do not execute the install scriptlet if one exists
--overwrite <glob>
overwrite conflicting files (can be used more than once)
--print-format <string>
specify how the targets should be printed
--sysroot operate on a mounted guest system (root-only)
参考资料:
搭配vscode
vscode 安装 cmake 扩展
打开vscode
新建 c文件
c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
c文件的同级文件夹
新建 CMakeLists.txt
cmake
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(Test)
# 指定源文件
add_executable(${PROJECT_NAME} test.c)
# 如果需要链接库或者包含目录,可以添加以下命令
# include_directories(include)
# target_link_libraries(${PROJECT_NAME} libname)
c文件的同级文件夹
新建 ·bin文件夹
用于存放生成的内容
新建终端进入 bin 文件夹, 执行 cmake ..
如果出现下面这种情况,需要以管理员打开vscode
或者直接修改vscode的属性,默认以管理员执行
进入 bin 文件夹 执行 cmake ..
PS C:\vs> cd .\CMake_test\bin\
PS C:\vs\CMake_test\bin> cmake ..
-- Building for: Ninja
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/msys64/mingw64/bin/cc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (1.5s)
-- Generating done (0.0s)
-- Build files have been written to: C:/vs/CMake_test/bin
PS C:\vs\CMake_test\bin>
bin文件夹生成了内容·
默认没有生成 cmakefiles
不能用 make
可以用 ninja
或者特别指定 生成 makefile
先清理之前的生成内容
可以用 该命令查看默认的编译选项(带星号) 和可选的编译选项
cmake -G -h
选一个 生成 makefile的
cmake -G "Unix Makefiles" ..
就生成了对应的 Makefile 文件
执行 make
或者写入 环境变量
重启vscode 查看 编译选项,默认选项已经变为 写入的环境变量值
cmake -G -h
或者使用通用的指令
cmake --build .
cmake --build .
、make
和cmake -G "Unix Makefiles" .
这三个命令在CMake项目构建流程中有不同的作用和目的:
cmake -G "Unix Makefiles" .
- 这个命令是配置阶段的命令,它告诉CMake生成适用于Unix环境(如Linux或macOS)的Makefile。
-G
选项后跟的是生成器名称,这里是"Unix Makefiles",表示我们想要使用Make作为编译工具链的一部分来构建项目。- CMake会读取当前目录下的
CMakeLists.txt
文件,根据其中的指令生成相应的Makefile和其他必要的构建支持文件。- 通常这个命令会在一个独立的构建目录下执行,比如:
cmake -G "Unix Makefiles" ../src
,这里指定源代码路径为../src
。make
make
是在配置阶段完成后执行的构建命令,用于实际编译和链接源代码。- 当CMake已经生成了Makefile之后,你就可以在同一个目录下运行
make
命令来构建项目,它会按照Makefile中的规则进行编译、链接以及其它构建步骤。- 如果没有特别指定目标,
make
默认会尝试构建CMakeLists.txt中定义的主目标,通常是可执行程序或者库文件。cmake --build .
- 这个命令也是用于构建阶段,但它是CMake提供的跨平台构建工具,可以在任何平台上工作,而不仅仅限于Unix系统,并且可以处理不同类型的生成器输出(不仅仅是Makefile)。
- 不需要关心底层使用的具体构建系统是什么,
cmake --build .
会自动调用合适的构建工具(在这种情况下,如果之前是用Unix Makefiles
生成器配置的,则调用make
)。- 可以通过附加参数指定要构建的目标,例如清理(
cmake --build . --target clean
)、安装(cmake --build . --target install
)等,而且这个命令在多配置环境中(如Visual Studio的Debug/Release模式切换)更加方便。总结来说:
cmake -G "Unix Makefiles" .
是配置阶段用来生成Makefile的命令。make
是基于生成的Makefile进行实际编译构建的命令。cmake --build .
是一个统一的构建接口,能够兼容多种构建系统,简化构建过程,并可以直接从CMake层面上控制构建行为。
安装 vscode 的 cmake 插件 后 启动vscode 会要求配置 cmake 的工具
这样每次 保存 CMakeLists.txt
时,就会重新生成一次Cmake文件
cmake --build . --target install
)等,而且这个命令在多配置环境中(如Visual Studio的Debug/Release模式切换)更加方便。
总结来说:
cmake -G "Unix Makefiles" .
是配置阶段用来生成Makefile的命令。make
是基于生成的Makefile进行实际编译构建的命令。cmake --build .
是一个统一的构建接口,能够兼容多种构建系统,简化构建过程,并可以直接从CMake层面上控制构建行为。
安装 vscode 的 cmake 插件 后 启动vscode 会要求配置 cmake 的工具
这样每次 保存 CMakeLists.txt
时,就会重新生成一次Cmake文件