CMake Msys2 搭配vscode

news2024/11/19 15:35:10

(一)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)

img

官方仓库:Index of /distrib/ (msys2.org)

img

安装包有三种:

  • msys2-x86_64-*.exe: GUI安装程序
  • msys2-base-x86_64-*.sfx.exe: 只是自解压归档中的文件(缺少Windows集成,如 快捷方式,卸载入口,但其他工作相同)
  • msys2-base-x86_64-*. tar.xz: 与.sfx.exe相同,但作为xz归档文件

注意,下载的安装程序可能会被系统识别为不安全的,放心保留即可。

img

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)

img

另外,安装时可能会被 Microsoft Defender SmartScreen 或类似的产品拦截,信任安装即可。

(三)环境/子系统

MSYS2 安装完成后,你可以看到同时安装了6子程序:

img

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

image-20240112090747327

(四)安装软件

打开 MSYS2 MINGW64

mingw工具链安装

pacman -S --needed base-devel mingw-w64-x86_64-toolchain

image-20240112090936737

直接回车 回车

image-20240112091208506

安装完成

安装cmake 和make

安装make组件

pacman -S mingw-w64-x86_64-make

安装cmake组件

pacman -S mingw-w64-x86_64-cmake

image-20240112091710241

配置环境

搜索下 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

image-20240112092234106

mingw64bin目录配置到环境变量Path中。

C:\msys64\mingw64\bin

image-20240112091610625

验证环境

windows 的 终端 执行 gcc -v g++ -v make -v

cmake -v gdb -v

(更新包数据库和基础包。除非您的安装文件是最新的)

pacman -Su

image-20240112090831715

其他msys2命令

MSYS2 使用 Pacman 进行软件包管理(包括 安装、更新、卸载等)

1. pacman -Suy 更新软件包

该命令会更新核心包和非核心包,核心包指MSYS2本身依赖的包(如:mintty、msys2-runtime、pacman等)

img

如果核心包、非核心包都需要更新,则该命令会先更新核心包,然后才能更新非核心包。更新完核心包后,会要求关闭所有已打开的终端,然后再重新执行一遍 pacman -Suy 命令,才会去更新非核心包。

img

2. pacman -Qs 搜索已安装的软件包

img

3. pacman -Ss 在所有软件包仓库中搜索

img

已安装的软件包,会提示 [installed]

4. pacman -S 安装软件包

img

5. pacman -R 卸载软件包

pacman -R <name of the package>

注意,该命令仅卸载软件包,无法卸载该软件包安装时的依赖包,也无法移除该软件运行过程中产生的任何文件。

6. pacman -Sg 列出软件包

列出所有软件包组:

pacman -Sg

列出某个软件包组中所有的软件包:

pacman -Sg <group>

7. pacman -Q 列出已安装的软件包

列出已安装的软件包:

pacman -Q

列出所有从 Arch Linux 官方软件仓库安装的软件包:

pacman -Qe

8. pacman -Sw 下载软件包但不安装

pacman -Sw <package>

9. pacman -U 从本地安装软件包

pacman -U <packagefile.tar.zst>

支持 tar.xz,tar.zst 两种类型的归档包安装。归档包可以从这里下载:Index of / (msys2.org)

但需要注意,该本地安装方式,无法自动安装软件包的依赖,需要你自行解决依赖的软件包。

可以通过 pacman -Qi 查看依赖的软件包。

10. pacman -Qi 查看软件包详细信息

pacman -Qi <package>

关于pacman命令的更多用法

可通过 pacman -h 查看

$ 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 查看某个参数的更详细用法,如:

$ 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 扩展

image-20240112093050610

打开vscode

新建 c文件

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

c文件的同级文件夹新建 CMakeLists.txt

# 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文件夹 用于存放生成的内容

image-20240112093916352

新建终端进入 bin 文件夹, 执行 cmake ..

如果出现下面这种情况,需要以管理员打开vscode

image-20240112094233167

或者直接修改vscode的属性,默认以管理员执行

image-20240112094625700

进入 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文件夹生成了内容·

image-20240112094847370

image-20240112094951305

默认没有生成 cmakefiles

不能用 make

image-20240112095114147

可以用 ninja

image-20240112095210890

或者特别指定 生成 makefile

先清理之前的生成内容

image-20240112095332839

可以用 该命令查看默认的编译选项(带星号) 和可选的编译选项

cmake -G -h

image-20240112095447370

选一个 生成 makefile的

image-20240112095932627

cmake -G "Unix Makefiles" ..

image-20240112100626947

image-20240112100347724

就生成了对应的 Makefile 文件

image-20240112100157940

执行 make

image-20240112101010544

或者写入 环境变量

image-20240112101643008

重启vscode 查看 编译选项,默认选项已经变为 写入的环境变量值

cmake -G -h 

image-20240112101849277

或者使用通用的指令

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文件

image-20240112102330742

image-20240112102446270

image-20240112102626382
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文件

image-20240112102330742
image-20240112102446270

image-20240112102626382

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务 seata+nacos 部署

分布式事务 seatanacos 部署 一、下载seata二、解压配置三、导入数据库四、nacos配置五、配置要引入事务的模块的配置文件六、启动七、测试 这里使用的版本&#xff1a; nacos&#xff1a;2.0.4 seata&#xff1a;1.5.2 seata官方地址&#xff1a;https://seata.apache.org/zh-…

unity addressables 加载资源和场景 显示进度条(主要用于WebGL)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、addressables是什么&#xff1f;二、导入Addressables三、创建Addressables Settings 资产包管理四、资源打包五、环境模拟六、查看重复资源七、选择Bundle…

WordPress主题YIA的文章页评论内容为什么没有显示出来?

有些WordPress站长使用YIA主题后&#xff0c;在YIA主题设置的“基本”中没有开启“一键关闭评论功能”&#xff0c;而且文章也是允许评论的&#xff0c;但是评论框却不显示&#xff0c;最关键的是文章原本就有的评论内容也不显示&#xff0c;这是为什么呢&#xff1f; 根据YIA主…

【毕业日记】2024.01 - 慢下来,静待花开

转眼距离930离开鹅厂已经120天了&#xff0c;我是很能拖延的&#xff0c;或者是很懂自我麻痹的&#xff0c;这三个多月&#xff0c;一直想要写点东西纪念&#xff0c;一直拖一直拖一直拖…… 疫情这几年经济下行里裁员是个茶余饭后“嬉笑”之余经常被提起的词&#xff0c;部门滚…

python 实现 macOS状态栏 网速实时显示

安装依赖包&#xff1a; pip install pillow psutil rumpsnetSpeedApp.py from PIL import Image, ImageDraw, ImageFont import psutil import rumpsclass NetSpeedApp(rumps.App):def __init__(self):super(NetSpeedApp, self).__init__("NetSpeed")self.titlese…

Node需要了解的知识

Node能执行javascript的原因。 浏览器之所以能执行Javascript代码&#xff0c;因为内部含有v8引擎。Node.js基于v8引擎封装&#xff0c;因此可以执行javascript代码。Node.js环境没有DOM和BOM。DOM能访问HTML所有的节点对象&#xff0c;BOM是浏览器对象。但是node中提供了cons…

Postgres与DynamoDB:选择哪个数据库

启动新项目时需要做出的决定之一是使用哪个数据库。如果您使用的是Django这样的包含电池的框架&#xff0c;那么没有理由再三考虑。选择一个受支持的数据库引擎&#xff0c;就可以了。另一方面&#xff0c;如果你使用像FastAPI或Flask这样的微框架&#xff0c;你需要自己做出这…

手把手教你搭建属于自己的网站(获取被动收入),无需服务器,使用github托管

大家好&#xff0c;我是亚洲著名程序员青松&#xff0c;本次教大家如何搭建一个属于自己的网站。 下面是我自己搭建的一个网站&#xff0c;是一个网址导航网站。托管在了github上面&#xff0c;目前已经运营了三个月&#xff0c;每天的访问量大约有100ip左右。 下图是在51.la上…

一键部署FC超级马里奥web游戏

效果展示 安装 拉取镜像 #拉取镜像 docker pull stayhungrystayfoolish666/mario #创建并启动容器 docker run -d -p 10034:8080 --name maliao --restartalways stayhungrystayfoolish666/mario:latest 使用 浏览器打开 http://你的ip:10034/

微信小程序 安卓/IOS兼容问题

一、背景 在开发微信小程序时&#xff0c;不同的手机型号会出现兼容问题&#xff0c;特此记录一下 二、安卓/IOS兼容问题总结 2.1、new Date()时间转换格式时&#xff0c;IOS不兼容 问题&#xff1a;在安卓中时间格式2024-1-31 10:10:10&#xff0c;但是在iOS中是不支持 &q…

基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的电能质量扰动识别模型

目录 往期精彩内容&#xff1a; 引言 1 快速傅里叶变换FFT原理介绍 第一步&#xff0c;导入部分数据&#xff0c;扰动信号可视化 第二步&#xff0c;扰动信号经过FFT可视化 2 电能质量扰动数据的预处理 2.1 导入数据 第一步&#xff0c;按照公式模型生成单一信号 2.2 …

JavaScript基础五对象 内置对象 Math.random()

内置对象-生成任意范围随机数 Math.random() 随机数函数&#xff0c; 返回一个0 - 1之间&#xff0c;并且包括0不包括1的随机小数 [0, 1&#xff09; 如何生成0-10的随机数呢&#xff1f; Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…

wespeaker项目grpc-java客户端开发

非常重要的原始参考资料&#xff1a; 链接: triton-inference-server/client github/grpc java ps&#xff1a; 使用grpc协议的其它项目python/go可以参考git hub目录client/tree/main/src/grpc_generated下的其它项目 其它链接&#xff1a; 想要系统了解triton-inference-ser…

最近nvm安装报错的原因找到了——npm原淘宝镜像正式到期!

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 错误原因 问题排查 淘宝镜像 证书到期 问题解决 结语 背景 我们…

在PostgreSQL中不开归档?恭喜你!锅你背定了

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

获取ping值最小IP

有时候我们访问一个网站&#xff0c;想要选择最佳的IP地址&#xff0c;那就可能需要修改hosts文件。那么怎么获取最佳的IP地址呢&#xff0c;我们以访问github为例。 获取IP 首先是看对应的url会解析出哪些IP。可以在通过站长工具测试多个地点Ping服务器,网站测速 - 站长工具…

【循环结构·js】

变量命名原则 变量名由字母、下划线、$ 或数字组成&#xff0c;并且必须由字母、下划线、$ 开头。 变量名不能命名为系统关键字和保留字。 JS代码在sourse里面调试 document.write(str); /*在页面上输出变量 str 的值*/数据类型的分类 为什么要标识数据类型&#xff1a; 不…

【C语言】通讯录实现(下)

目录 1.进阶通讯录特点&#xff08;下&#xff09; 2.实现步骤 &#xff08;1&#xff09;保存增加的联系人数据到文件中 &#xff08;2&#xff09;加载保存的联系人数据 3.完整C语言通讯录代码 &#xff08;1&#xff09;contact.h (2)test.c (3)contact.c 4.结语 1.…

【C++初阶】--入门基础(二)

目录 一.C输出与输入 二.缺省参数 1.概念 2.缺省参数分类 (1) 全缺省参数 (2)半缺省参数 三.函数重载 1.概念 2.C支持函数重载的原理--名字修饰 四.引用 1.概念 2.语法 3.引用的特性 (1)引用在定义时必须初始化 (2)引用时不能改变指向 (3)一个变量…

故障诊断 | 一文解决,RF随机森林的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,RF随机森林的故障诊断(Matlab) 模型描述 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,常用于解决分类和回归问题。它由多个决策树组成,每个决策树都独立地对数据进行训练,并且最终的预测结果是由所有决策…