CMake Msys2 搭配vscode

(一)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 提供了多个子环境以支持不同架构和编译器的开发需求。以下是这六个名称所代表的不同环境及其区别:

  1. MSYS2 CLANG64

    • 这是指使用LLVM/Clang作为编译器,面向Windows 64位系统的环境。
    • 在这个环境下,你可以获得与MinGW64类似的工具链,但使用的是Clang而非GCC作为C/C++编译器。
  2. MSYS2 CLANGARM64

    • 这是用于为ARM64(AArch64)架构编译代码的环境,同样使用Clang编译器。
    • 它允许开发者在Windows系统上构建适用于ARM64架构的应用程序。
  3. MSYS2 MINGW32

    • 这是一个面向32位Windows应用程序开发的MinGW(Minimalist GNU for Windows)环境。
    • 使用GCC作为编译器,并提供了一套模拟POSIX API以便于移植Linux或其他类Unix环境下的代码到Windows 32位平台。
  4. MSYS2 MINGW64

    • 类似于MINGW32,但针对的是64位Windows应用程序开发。
    • 提供了64位版本的GCC编译器以及对应的库,同样支持POSIX兼容层。
  5. MSYS2 MSYS

    • 这是MSYS2自带的一个基础的bash shell环境,它主要用来运行简单的Unix命令行工具和脚本。
    • MSYS环境主要用于处理那些需要更接近于Linux ABI的软件包安装和维护任务,而不是直接编译Windows原生应用。
  6. 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

mingw64bin目录配置到环境变量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 .makecmake -G "Unix Makefiles" . 这三个命令在CMake项目构建流程中有不同的作用和目的:

  1. cmake -G "Unix Makefiles" .

    • 这个命令是配置阶段的命令,它告诉CMake生成适用于Unix环境(如Linux或macOS)的Makefile。-G选项后跟的是生成器名称,这里是"Unix Makefiles",表示我们想要使用Make作为编译工具链的一部分来构建项目。
    • CMake会读取当前目录下的CMakeLists.txt文件,根据其中的指令生成相应的Makefile和其他必要的构建支持文件。
    • 通常这个命令会在一个独立的构建目录下执行,比如:cmake -G "Unix Makefiles" ../src,这里指定源代码路径为../src
  2. make

    • make是在配置阶段完成后执行的构建命令,用于实际编译和链接源代码。
    • 当CMake已经生成了Makefile之后,你就可以在同一个目录下运行make命令来构建项目,它会按照Makefile中的规则进行编译、链接以及其它构建步骤。
    • 如果没有特别指定目标,make默认会尝试构建CMakeLists.txt中定义的主目标,通常是可执行程序或者库文件。
  3. 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文件


相关推荐
threelab1 小时前
12.three官方示例+编辑器+AI快速学习webgl_buffergeometry_indexed
学习·编辑器·webgl
MonkeyKing_sunyuhua1 小时前
在 Visual Studio Code (VSCode) 中配置 MCP(Model Context Protocol)
ide·vscode·编辑器
smileNicky1 小时前
在 VSCode 中运行 Vue.js 项目
ide·vue.js·vscode
Growthofnotes2 小时前
VSCode中Node.js 使用教程
ide·vscode·node.js
遗憾皆是温柔3 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
小妖6665 小时前
VScode 的插件本地更改后怎么生效
ide·vscode·编辑器
进击的阿尔法猿5 小时前
visual studio生成动态库DLL
ide·visual studio
未来之窗软件服务6 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide
Qian丶Xi7 小时前
Visual Studio旧版直链
ide·visual studio
MonkeyKing_sunyuhua7 小时前
ubuntu22.04卸载vscode
ide·vscode·编辑器