cmake和vscode 下的cmake的使用详解(一)。

news2024/12/23 14:52:08

本文的内容

参考如下内容。

1.【基于VSCode和CMake实现C/C++开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source=0ddb24a02523448baa69b0b871ab50f7

2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.

3.关于如何利用vscode 包含.h 文件的问题_vscode怎么引入自定义头文件-CSDN博客

4. linux系统03--makefile文件,gdb 以及文件描述符_cat_fish_rain的博客-CSDN博客

5.linux 系统中vi 编辑器和库的制作和使用02_cat_fish_rain的博客-CSDN博客 

第一讲:

什么是linux系统?

  • Linux是开源的操作系统

多用户多任务:

  • 单用户:一个用户,在登录计算机(操作系统),只能允许同时登录一个用户;
  • 单任务:一个任务,允许用户同时进行的操作任务数量;
  • 多用户:多个用户,在登录计算机(操作系统),允许同时登录多个用户进行操作;
  • 多任务:多个任务,允许用户同时进行多个操作任务;

Windows属于:单用户、多任务。

Linux属于:多用户、多任务。

Linux一切皆文件

对于文件的操作的都有哪些种类?

  • 创建文件、编辑文件、保存文件、关闭文件、重命名文件、删除文件、恢复文件
  • 1.1 目录结构

    目录结构:

  • **Bin:**全称binary,含义是二进制。该目录中存储的都是一些二进制文件,文件都是可以被运行的。
  • Dev:该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载(类似window的分配盘符)。
  • **Etc:**该目录主要存储一些配置文件。
  • Home:表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录。
  • **Proc:**全称process,表示进程,该目录中存储的是Linux运行时候的进程。**Root:**该目录是root用户自己的家目录。**Sbin:**全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。**Tmp:**表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。

  • **Usr:**存放的是用户自己安装的软件。类似于windows下的program files。
  • **Var:**存放的程序/系统的日志文件的目录。
  • **Mnt:**当外接设备需要挂载的时候,就需要挂载到mnt目录下。

1.2 指令与选项

  • 指令含义:
  • Linux的指令是指在Linux**终端(命令行)**中输入的内容。
  • 指令格式:
    • 完整指令的标准格式命令(空格) [选项](空格) [操作对象]
    • 选项和操作对象都可以没有,也可以是多个

# 指令示例:以下两条指令等价
ls -l -a -h /home ./
ls -lah /home ./

1.3 重要指令讲解 +【实战】命令行

  • pwd - Print current working directory
    • **作用:**打印当前终端所在的目录
    • 用法: pwd

# 打印当前目录
pwd

  • ls - List directory contents
    • **作用:**列出当前工作目录下的所有文件/文件夹的名称

    • 用法1:ls

      **含义:**列出当前工作目录下的文件/文件夹的名称

    • ls

  • 用法2:ls [路径]

    含义:列出指定路径下的所有文件/文件夹的名称

    • 绝对路径:相对根目录的路径;
    • 相对路径:相对当前目录的路径;
  • # ls 相对路径
    ls ./   #【表示当前目录下】
    ls ../  #【上一级目录下】
    # ls 绝对路径
    ls /home
# ls 相对路径
ls ./ # 【表示当前目录下】
ls ../ # 【上一级目录下】
# ls 绝对路径
ls /home

用法 3 ls [ 选项 ] [ 路径 ]
含义: 在列出指定路径下的文件 / 文件夹的名称,并以指定的格式进行显示。
# ls 选项 路径
ls -lah /home
# 选项解释:
-l :表示 list ,表示以详细列表的形式进行展示
-a :表示显示所有的文件 / 文件夹(包含了隐藏文件 / 文件夹)
-h :表示以可读性较高的形式显示
# ls -l “-” 表示改行对应的文档类型为文件, “d” 表示文档类型为文件夹。
# Linux 中隐藏文档一般都是以 “.” 开头
 

 

cd - change directory
作用: 切换当前的工作目录
用法 1 cd cd ~
# 以下两条命令等价,示直接进入当前用户的家目录下【很常用】
cd
cd ~

 用法2cd [相对路径]

# 进入到上级目录下
cd ..
# 进入到上级目录中的 local 目录下
cd ../local

 用法3cd [绝对路径]

# 进入到 /usr/local 目录下
cd /usr/local
mkdir - make directories
作用: 创建目录
用法 1 mkdir 路径
# 在当前路径下创建出目录 “myfolder”
mkdir myfolder
用法 2 mkdir -p 路径
含义: 一次性创建多层不存在的目录
# 创建 ~/a/b/c 目录
mkdir -p ~/a/b/c

 

用法 3 mkdir 路径 1 [ 路径 2] [ 路径 3]
含义: 一次性创建多个目录

 

# 在当前目录分别创建 a b c 三个文件夹
mkdir a b c
touch - change file timestamps
作用: 创建新文件
------------------------------------------------------------------------
-----------------------------
# 【为什么创建新文件是 touch
# 1. touch 的作用本来不是创建文件,而是将指定文件的修改时间设置为当前时间。就是假
touch )了一下这个文件,假装文件被 修改 了,于是文件的修改时间就是被设置为当前
时间。
# 2. 这带来了一个副作用,就是当 touch 一个不存在的文件的时候,它会创建这个文件。然后,
由于 touch 已经可以完成创建文件的功能了,就不再需要一个单独的 create 了。
------------------------------------------------------------------------
-----------------------------

 用法1touch [路径]

# 在当前目录下创建 linux.txt 文件
touch linux.txt
# 在上级目录下创建 linux 文件
touch ../linux
# /home/bing/ 目录下创建 myfile 文件
touch /home/bing/myfile

 用法2touch [路径1] [路径2]

# 在当前目录下创建 file file.txt
两个文件
touch file file.txt
rm - remove files or directories
作用: 删除文件 / 目录
用法 1 rm [ 选项 ] 需要移除的文件路径

 

# 删除当前路径下的 myfile 文件
rm myfile
# 删除 /usr 路径下的 myfile 文件
rm /usr/myfile

用法2rm [选项] 需要移除的目录  

# 删除当前路径下的 abc 文件
rm -rf myfolder
# 删除 /usr 路径下的 abc 文件
rm -rf /usr/myfolder

cp - copy files and directories  

作用: 复制文件 / 文件夹到指定的位置
用法 1 cp [ 被复制的文件路径 ] [ 文件被复制到的路径 ]
# cp 命令来复制一个文件
cp /home/bing/myfile ./
用法 2 cp -r [ 被复制的文件夹路径 ] [ 文件夹被复制到的路径 ]* *
含义: -r 表示递归复制,复制文件夹的时候需要加 -r

 

# 复制 /home/bing/myfolder 文件夹到根目录 /
cp -r /home/bing/myfolder /
用法 3 mkdir [ 路径 1] [ 路径 2] [ 路径 3]
含义: 一次性创建多个目录
mv - move (rename) files
作用: 移动文件到新的位置,或者重命名文件
用法: mv [ 需要移动的文件路径 ] [ 需要保存的位置路径 ]
# 移动当前目录下 myfile 文件到根目录 /
mv myfile /myfile
# 移动当前目录下 myfolder 文件夹到根目录 /
mv myfolder /myfolder
# 移动当前目录下 myfile 到根目录 / 下,并重命名为 myfile007
mv myfile myfile007

 

man - an interface to the system reference manuals
作用: 包含了 Linux 中全部命令手册
用法: man [ 命令 ]
含义: 查看命令使用手册,按 q 退出
# 查看 ls 命令的手册
man ls
# 查看 cd 命令的手册
man cd
# 查看 man 命令的手册
man man

 

reboot - reboot the machine
作用: 重启 linux 系统
用法: reboot

 

 

# 立即重启
reboot
shutdown - power-off the machine
作用: 关机
用法: shut -h [ 时间 ]
# 立即关机
shutdown -h now

 

1.4 文件编辑

👇 Vim 操作终极图片 👇
所有的 Linux 系统都会内建 Vi/Vim 编辑器,其他的编辑器则不一定会存在
Vim 是所有 Unix Linux 系统下标准的编辑器
Vim 具有程序开发的能力,也可以用来对文件进行简单的编辑
Vim 具有 编辑器之神 的称号 ,学会 Vim 便可在 Linux 的世界里 畅行无阻 尤其是在终端中

 

gedit [file]
Linux 下的一个纯文本编辑器
可以根据不同的语言高亮显现关键字和标识符。
nano [file]
nano 是一个小巧的文本编辑器
它比 vi/vim 要简单得多,比较适合 Linux 初学者使用。
某些 Linux 发行版的默认编辑器就是 nano

第二讲:开发环境搭建

2.1 编译器,调试器安装
安装 GCC GDB
sudo apt update
# 通过以下命令安装编译器和调试器
sudo apt install build-essential gdb

 安装成功确认

# 以下命令确认每个软件是否安装成功
# 如果成功,则显示版本号
gcc --version
g ++ --version
gdb --version

 

2.2 CMake安装

安装 cmake
# 通过以下命令安装编译器和调试器
sudo apt install cmake

安装成功确认  

# 确认是否安装成功
# 如果成功,则显示版本号
cmake --version

第三讲:GCC编译器 

前言
1. GCC 编译器支持编译 Go Objective-C Objective-C ++ Fortran Ada D BRIG HSAIL
等程序;
2. Linux 开发 C/C++ 一定要熟悉 GCC
3. VSCode 是通过调用 GCC 编译器来实现 C/C++ 的编译工作的;
实际使用中:
使用 gcc 指令编译 C 代码
使用 g++ 指令编译 C++ 代码
3.1 编译过程
1. 预处理 -Pre-Processing //.i 文件
# -E 选项指示编译器仅对输入文件进行预处理
g++  -E test.cpp  -o test.i   //.i文件
2. 编译 -Compiling // .s 文件
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
# g++ 产生的汇编语言文件的缺省扩展名是 .s 
g++  -S test.i  -o   test.s
3. 汇编 -Assembling // .o 文件
# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++  -c test.s  -o test.o
4. 链接 -Linking // bin 文件
        
# -o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o  -o test

3.2 g++重要编译参数

1. -g 编译带调试信息的可执行文件
# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
# 产生带调试信息的可执行文件test
g++ -g test.cpp
2. -O[n] 优化源代码
## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作
会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
# -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2
选项告诉 g++ 产生尽可能小和尽可能快的代码。 如 -O2 -O3 -On n 常为 0–3
# -O 同时减小代码的长度和执行时间,其效果等价于 -O1
# -O0 表示不做优化
# -O1 为默认优化
# -O2 除了完成 -O1 的优化之外,还进行一些额外的调整工作,如指令调整等。
# -O3 则包括循环展开和其他一些与处理特性相关的优化工作。
# 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
# 使用 -O2 优化源代码,并输出可执行文件
g ++ -O2 test.cpp
  3. -l -L 指定库文件 | 指定库文件路径
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
# 链接glog库
g++ -lglog test.cpp
# 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在的目录名
# 链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
4. -I 指定头文件搜索目录
# -I 
# /usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/icnclude
里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-
I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错
误。-I参数可以用相对路径,比如头文件在当前 目录,可以用-I.来指定。上面我们提到的–cflags参
数就是用来生成-I参数的。
g++ -I/myinclude test.cpp
5. -Wall 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
6. -w 关闭警告信息
# 关闭所有警告信息
g++ -w test.cpp
7. -std=c++11 设置编译标准
# 使用 c++11 标准编译 test.cpp
g++ -std=c++11 test.cpp
8. -o 指定输出文件名
# 指定即将产生的文件名
# 指定输出可执行文件名为test
g++ test.cpp -o test
9. -D 定义宏
# 在使用gcc/g++编译的时候定义宏
# 常用场景:
# -DDEBUG 定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭
DEBUG
示例代码:
// -Dname 定义宏name,默认定义内容为字符串“1”
#include <stdio.h>
int main()
{
    #ifdef DEBUG
   printf("DEBUG LOG\n");
    #endif
   printf("in\n");
}
// 1. 在编译的时候,使用gcc -DDEBUG main.cpp
// 2. 第七行代码可以被执行

3.3 【实战】g++命令行编译 

        案例:最初目录结构: 2 directories, 3 files

# 最初目录结构
.
├── include
│   └── Swap.h
├── main.cpp
└── src
  └── Swap.cpp
   
2 directories, 3 files

3.3.1 直接编译

最简单的编译,并运行
# 将 main.cpp src/Swap.cpp 编译为可执行文件
g++ main.cpp src/Swap.cpp -Iinclude
# 运行a.out
./a.out
增加参数编译,并运行
# 将 main.cpp src/Swap.cpp 编译为可执行文件 附带一堆参数
g++ main.cpp src/Swap.cpp -Iinclude -std=c++11 -O2 -Wall -o b.out
# 运行 b.out
./b.out

3.3.2 生成库文件并编译

链接静态库生成可执行文件①:

## 进入src目录下
$cd src
# 汇编,生成Swap.o文件
g++ Swap.cpp -c -I../include
# 生成静态库libSwap.a
ar rs libSwap.a Swap.o
## 回到上级目录
$cd ..
# 链接,生成可执行文件:staticmain
g++ main.cpp -Iinclude -Lsrc -lSwap -o staticmain
链接 动态库 生成可执行文件②:
## 进入src目录下
$cd src
# 生成动态库libSwap.so
g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so
## 上面命令等价于以下两条命令
# gcc Swap.cpp -I../include -c -fPIC
# gcc -shared -o libSwap.so Swap.o
## 回到上级目录
$cd ..
# 链接,生成可执行文件:sharemain
g++ main.cpp -Iinclude -Lsrc -lSwap -o sharemain
编译完成后的目录结构
        最终目录结构: 2 directories, 8 files

3.3.3 运行可执行文件

运行可执行文件①

# 运行可执行文件
./staticmain
运行可执行文件②
# 运行可执行文件
LD_LIBRARY_PATH=src ./sharemain

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

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

相关文章

通过navicat工具将excel文件导入数据库的表中

文章目录 1.navicat可视化工具2. 导入文件 1.navicat可视化工具 这里使用的是navicat数据库可视化工具&#xff0c;不是直接通过数据库指令导入的 前提是连接好数据库&#xff0c;建立好表&#xff0c;如下图&#xff0c;test为连接名&#xff0c;随便起&#xff0c;data为数据…

SQL Sever 基础知识 - 数据排序

SQL Sever 基础知识 - 二 、数据排序 二 、对数据进行排序第1节 ORDER BY 子句简介第2节 ORDER BY 子句示例2.1 按一列升序对结果集进行排序2.2 按一列降序对结果集进行排序2.3 按多列对结果集排序2.4 按多列对结果集不同排序2.5 按不在选择列表中的列对结果集进行排序2.6 按表…

uni-app 自带返回方法onBackPress,返回上一级并且刷新页面内容获取最新的数据

onBackPress 返回上一级并且刷新页面内容获取最新的数据 onBackPress 方法是uinapp自带返回键方法&#xff0c;也就是在app和H5返回键 onBackPress() {setTimeout(() > {uni.switchTab({url: /pages/Users/index,})}, 300)return true}, methods: {}在这里 uni.switchTab…

Goby 漏洞发布| CrushFTP as2-to 认证权限绕过漏洞(CVE-2023-43177)

漏洞名称&#xff1a; CrushFTP as2-to 认证权限绕过漏洞&#xff08;CVE-2023-43177&#xff09; English Name&#xff1a;CrushFTP as2-to Authentication Permission bypass Vulnerability (CVE-2023-43177) CVSS core: 9.8 影响资产数&#xff1a; 38695 漏洞描述&…

【投稿优惠|稳定出版】2023年信息科学和大数据应用国际会议 (ICISBDA 2023)

2023年信息科学和大数据应用国际会议 (ICISBDA 2023&#xff09; 2023 International Conference on Information Science and Big Data Applications &#xff08;ICISBDA 2023&#xff09; 一、会议简介 &#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&…

kernel | 不想老是编译内核?sysfs和debugfs了解一下

编译内核是一件让大家都抗拒的事情&#xff0c;因为编译一次内核需要的时间成本比较漫长&#xff0c;而且如果每次代码的微小改动或者想要额外调用某一个函数执行某一个动作就要不断的编译内核的话&#xff0c;就相当于CPU大量的时间都用在了idle&#xff0c;开发效率将会是相当…

推荐几款python在线学习和电子书网站

学习python的过程中&#xff0c;虽然下载了很多的电子书&#xff0c;但是在学习过程中基本上都是通过一些在线网站或者在线电子书进行的。 下面给大家推荐几个在线学习教程网站和电子书网站。 《菜鸟教程》 一句话介绍&#xff1a;很多初学者的选择 网址&#xff1a;https:…

kubernetes(K8s)(Namespace、Pod、Deployment、Service资源的基本操作)-04

Namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相的…

Spring三级缓存处理循环依赖的过程

Spring三级缓存 Spring三级缓存是什么&#xff1f; 一级缓存&#xff1a;单例池。存放的是完整的Bean对象。经过完整的生命周期。二级缓存&#xff1a;存放需要提前暴露的Bean对象。也就不完整的Bean对象。需要提前暴露就是指&#xff0c;可能会被循环依赖。(这里可能需要用代…

Day46力扣打卡

最近一直在做以前的题&#xff0c;刷题量都没有怎么增长&#xff0c;感觉自己算法一直不太行&#xff0c;但也只能菜就多练了。 打卡记录 由子序列构造的最长回文串的长度&#xff08;区间DP&#xff09; 链接 第二次刷这道题&#xff0c;相比上回思路来的很快&#xff0c;但…

C# 用代码设置受保护的Excel

写在前面 在导出Excel文件的时候&#xff0c;为了防止文件内容被篡改&#xff0c;这时候就需要对Excel设置工作簿保护和工作表保护&#xff0c;本文使用的是Spire.XLS的免费版本来实现&#xff0c;免费版本是受限的&#xff0c;但是一般情况下已经够用了。 通过NuGet引入Free…

Centos7安装docker、java、python环境

文章目录 前言一、docker的安装二、docker-compose的安装三、安装python3和配置pip3配置python软链接&#xff08;关键&#xff09; 四、Centos 7.6操作系统安装JAVA环境 前言 每次vps安装docker都要看网上的文章&#xff0c;而且都非常坑&#xff0c;方法千奇百怪&#xff0c…

使用 JDBC 连接 Neo4j(头歌)

文章目录 第1关&#xff1a;连接 Neo4j &#xff08;JDBC&#xff09;任务描述相关知识完成 JDBC 环境设置连接 Neo4j 对数据进行查询 编程要求测试说明答案测试前准备代码文件 第1关&#xff1a;连接 Neo4j &#xff08;JDBC&#xff09; 任务描述 本关任务&#xff1a;使用…

Logstash使用指南

介绍 Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化到你所选择的目的地。尽管Logstash的早期目标是搜集日志&#xff0c;现在它的功能已完全不只于此。任何事件类型都可以加入分析&…

【课设大报告】 基于matlab gui设计的三极管学习系统

目录 设计背景 1.1设计目的 2.设计方法 2.1使用软件工具 2.2设计流程 3.模块界面设计及代码分析 3.1登录 3.2注册 3.3主菜单 3.4三极管介绍 3.5进制转换 3.6单位换算 3.7绘图 4.不足和改善 5.总结 设计背景 1.1设计目的 本程序旨在帮助为了帮助学生了解三极管…

借助文档控件Aspose.Words,在 C# 中比较两个 PDF 文件

在当今的数字世界中&#xff0c;管理和比较文档是一项至关重要的任务&#xff0c;尤其是在商业和法律领域。在 C# 中处理 PDF 文档时&#xff0c;Aspose.Words for .NET 提供了用于比较 PDF 文档的强大解决方案。在这篇博文中&#xff0c;我们将探讨如何在 C# 应用程序中比较 P…

笔记64:Bahdanau 注意力

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a

联想SR660V2服务器重置BMC后无法设置BMC管理IP

之前登录后台显示BMC账号密码不对&#xff0c;然后把BMC重置了&#xff0c;重置以后发现无法设置IP地址 联想官方的回复是&#xff1a; 1. 机器AC上电后&#xff0c;需等待7分钟左右, 再开机&#xff0c;让bmc完全启动。 2. 在UEFI及系统下配置bmc网络&#xff0c;需等待3分钟…

人工智能 - 目标检测:发展历史、技术全解与实战

目录 一、早期方法&#xff1a;滑动窗口和特征提取滑动窗口机制工作原理 特征提取方法HOG&#xff08;Histogram of Oriented Gradients&#xff09;SIFT&#xff08;Scale-Invariant Feature Transform&#xff09; 二、深度学习的兴起&#xff1a;CNN在目标检测中的应用CNN的…

基于单片机设计的激光测距仪(采用XKC-Kl200模块)

一、前言 随着科技的不断进步和应用需求的增加&#xff0c;测距仪成为了许多领域必备的工具之一。传统的测距仪价格昂贵、体积庞大&#xff0c;使用起来不够方便。本项目采用STC89C52单片机作为主控芯片&#xff0c;结合XKC-KL200激光测距模块和LCD1602显示器&#xff0c;实现…