一 初识linux

Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。

(一) Linux组成

1 Linux内核

linux系统的核心,控制着计算机系统的所有硬件和软件,主要负责:系统内存管理,软件程序管理,硬件设备管理,文件系统管理。提供系统最核心的功能,调度cpu,内存分配,文件系统网络等等,主要包含对硬件的调度。

2 GUN工具

GUN包括文件,文本,进程实用工具。其中,shell是一种特殊的交互式工具。shell为用户提供了启动程序,管理文件,管理进程的途径。shell的核心是命令提示符,用来负责交互,然后解释命令在内核中执行。shell可以实现对文件的复制移动删除显示等基本操作,也可以把shell命令放在文件中作为shell脚本执行,为执行多个命令带来了极大的便利。在linux系统中,有不同的shell可以选择,如:bash shell,ash,korn,tcsh,zsh。

背景:linus创建了Linux内核,但他手上没有运行其上的系统工具,幸运的是GUN组织开发了一套完整的开源的Unix实用工具,(Unix系统原型:参与Multics项目的工程师休假期间问世,给工程师放假是多么重要的事~),于是linus的Linux内核和GUN的操作系统实用工具集合在一起,产生了一款完整且free(自由!)的操作系统。通常将linux内核和GUN工具结合统称为Linux。(它们彼此的相遇如同一场绝美的长吻,散发出如怡然的甜蜜和永恒的光荣)

3 图形化桌面环境

linux初期,只有一个文本界面可用,随着windows的流行,linux图形化桌面渐渐产生。同样有多种选择:早期的X windows,KDE Plasma,以及GNOME(现流行)

包含完整组件的linux系统包称为linux发型版,如:Red Hat ENter prise,Debian,Ubuntu,Gentoo等等,种类相当的丰富。


(二) 了解Shell

在linux中,shell用于合并编程语言以控制进程和文件,以及启动和控制其他程序;shell用于减少大量的重复输入和交互操作,能够进行批量的处理和自动化完成维护,减轻管理层的负担;shell是一个用户跟操作系统之间交互的命令解释器。也许在windows下我们常依赖鼠标和发达的图形化程序进行开发,但在linux系统下,使用shell是更高效的和应用程序进行交互的手段,是linux下开发必须掌握的技能。

1 CLI命令行界面

在图形化出现以前,和unix系统交互的唯一方式就是使用shell提供的文本命令行界面(CLI)。进入CLI的一种方式是,Linux系统的文本模式,该模式只提供一个shell CLI,这称为Linux控制台,模拟的是早期硬接线控制台终端。

然而在图像化环境提供了多种方式来访问命令行界面,如:GNOME Terminal,Knosoleh和xterm。其中red hat,ubuntu,centos采用GNOME桌面环境,所以也默认使用GNOME Terminal,并且易于上手。

2 使用虚拟机

由于学习linux系统如果直接覆盖掉我们经常使用的windows系统会给我们带来许多不便,所以我们可以使用虚拟机模拟虚拟计算机搭建linux环境进行学习,使用linux内核镜像和图形化界面搭建环境。

3 Finalshell,Xshell

跨越虚拟机操纵linux很不方便,存在复制粘贴,文件上传下载各种问题,所以可以选择使用第三方软件远程连接到linux系统,如Finalshell和Xshell,虚拟机可以后台运行。

4 Linux虚拟文件目录

请添加图片描述
请添加图片描述


(三) 基本shell指令

以下内容主要包含:如何使用shell的提供的基本命令来处理linux文件和目录

man:查找手册

  • man+name 显示对应指令的详细信息
  • mna -k name 关键词查找
  • pwd显示当前路径信息

cd:切换工作目录

  • cd 直接返回家目录
  • cd+绝对路径 切换到对应目录(/开头绝对路径)
  • cd +name 切换到当前工作目录下名为name的目录中
  • cd+.. 返回上一层目录

ls:列出文件和目录

  • ls 显示当前目录下的文件和目录
  • ls -F 区分文件类型的显示(如目录后+/,可执行文件后+*)
  • ls -a 显示隐藏文件
  • ls -R 递归的显示当前目录以及子目录中包含的文件
  • ls -l 显示长列表,包括文件类型,权限,大小,时间戳,名称等信息
  • ls -i 显示inode编号

通配符过滤列表:

  • ls -l appl? 显示appl+单个未知字符的所有文件
  • ls -l app* 显示所有以app开头的所有文件
  • ls -l [a-z]pple 显示所有名称满足(a~z)pple的文件
  • ls -l [ab]pple 显示apple和bpple的文件,如果存在
  • ls -l [!a]pple 显示第一个字母不是a且后续为pple名称的文件列表

上述几种通配符可以灵活搭配使用

touch:创建文件

  • touch+name 当前目录常见名为name的文件

cp: 复制文件

  • cp name1 name2 复制当前目录下的name1并生成新文件name2
  • -i 会询问是否覆盖已有文件
  • cp name1+路径/ 把name1文件复制到新的路径中去,名称和原来一样。路径后记得加/
  • cp /路径下的某文件a . 注意:一个点代表当前目录,把某路径下的a文件复制到当前目录
  • cp -R 路径1/ 路径2/ 把路径a中所有内容赋值到路径2里面,有的gnome终端版本会把前面目录整个复制过去,实际情况实际考虑。

cp可以搭配通配符

tab:命令行补全

  • 输入文件名 按tab,根据前缀匹配结果

ln:链接

  • ln -s a b 软链接,将b链接到a,a和b是不同的文件,inode编号不同
  • ln a b 硬链接,两者本质是同一个文件

只有同一设备进行硬链接,不同设备文件只能使用软连接

mv:重命名,移动

  • mv sad happy 把sad文件名改为happy
  • mv 路径1/文件a 路径2/ 把路径1下的a移动到路径2,这是剪切
  • mv 文件a 路径2/name2 把文件a移动到路径2下,顺便重命名为name2
  • mv 目录a 目录b 把a目录及其子目录移动到b目录下

rm:删除文件

  • rm -i 文件a 删除文件a并询问
  • rm -i -r 目录名 递归的询问删除目录中的子文件,有的终端也可以把目录也删除掉
  • rm -rf 删除目录树,危险危险危险,慎重使用
    rm也可以搭配通配符

mkdir,rmdir:目录管理

  • mkdir a b c 分别创建abc目录
  • mkdir -p a/b/c 创建目录及子目录
  • rmdir 目录a 删除空目录a,rmdir只能删空目录,没有-i,要先删目录里的文件

查看文件

  • file 文件名 查看文件类型
  • cat 文件名 打开整个文档查看内容
  • cat -n 显示行号
  • cat -b 显示行号不包含空行
  • more 文件名 可翻页,不会一下全打开
  • less 文件名可翻页,支持上下键,空格翻页,enter下一行
  • tail -n number 显示制定最后num行内容
  • head -n number 显示制定前num行内容,不加-n直接加数字也可以

二 linux下c/c++开发

配置环境:
在linux上下载安装gcc,g++,gdb调试器,camke,vim编辑器,vscode。
(gcc , g++分别是gnu的c & c++编译器)

编译过程图:
在这里插入图片描述

(一) 使用GCC编译器

1 g++参数:
  • 源文件生成可执行程序
    g++ hello.cpp -o hello

  • -g
    源文件生成带有调试信息的可执行文件
    g++ -g hello.cpp -o hello

  • -o,-on(0~3)
    优化源代码,处理一下十分垃圾的代码,提高效率
    time可以显示运行时间
    time ./hello.cpp

  • -l
    指定程序要链接的库,后加库名。本地的库可以直接链接使用。

  • -L
    /lib,/usr/lib,/usr/llocal/lib
    不在上述三个目录中,则L后加库文件所在的目录名

  • -I (大写i)
    指定头文件所在目录,若在/usr/include中不用指定,若不在就要去指定。

  • -Wall
    打印警告信息

  • -w
    关闭警告信息

  • -std=c++11
    设置编译标准

  • -o
    指定输出文件名称,linux中不加-o会默认生成a.out文件

  • -D
    定义宏,常用:-DDEBUG 用此开选择开启火关闭debug宏


2 具体案例
  • g++加入头文件和其他参数信息

项目目录:在这里插入图片描述

g++ main.cpp -Iinclude注意指定头文件

g++ mian.cpp -Iinclude -Wall -o swap加多个参数


  • 链接静态库
    1 汇编:
    cd src
    g++ -c swap.cpp
    2 生成库libswap.a
    ar rs swap.o libswap.a swap.o
    3 链接
    cd ..
    g++ main.cpp -Iinclude -lswap -Lsrc -o static_main

在这里插入图片描述


  • 链接动态库
    1 生成动态库libswap.so
    g++ swap.cpp -fpic -shared -o libswap.so
    2 链接库
    g++ main.cpp -Iinclude -lswap -Lsrc -o share_main
    3 访问(路径设置):
    LDLIBRARY_PATH=src./share_main
    在这里插入图片描述

(二) 常用GDB调试命令参数

GDB:GUN Debuger ,linux下最常用的调试c/c++程序的调试器能够跟踪程序错误,常见的,诸如vscode也是通过调用GDB实现c/c++debug工作。

调试准备
g++ -g main.cpp -o test:在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本,-g进行修改,不加-g不能用gdb调试。

gun+文件名 进入调试

l+行号 默认生成10行,当指定行号时,会生成以指定行号为中间的10行,用来查看代码,生成断点

quit 退出调试

调试过程
start:开始运行程序,常用单步调试

r:即run,使用后,程序自动从主函数运行到程序结束,会在断点处暂停。在使用r之前,要设置好断点。调试中再次使用r会重新开始调试。

s:即step,使用后会逐语句的进入程序下一行,遇到函数会进入函数中执行。

n:即next,同step类似,但next遇到函数时,不会进入函数,会返回调用,除非函数中设有断点。

c:即continue,从当前位置连续执行,遇到下一个断点处停止

断点
b+行号 b即breakpoint,在第几行设置断点

info+b 显示断点信息,包括断点编号

d+断点编号 删除断点,断电编号不是行号,用info可查看

disable+断点编号 关闭断点,info中可显示断点状态信息,keep y为打开,keep n为关闭

enable+断点编号 打开断点

打印变量
p+变量名 输出变量值,打印地址可+&即可,注意只显示一次,打印数组同样输入数组名即可。

display+变量名 一直显示某个变量值,用于跟踪变量值,查看变化过程

info+display 查看变量编号

undisplay+变量编号 关闭常显示变量值,不加编号关闭全部

函数
bt 查看函数堆栈调用次数层级等信息,主要用于函数内部或递归调用时

finish 完成当前函数,若为一层函数,直接完成;若为递归函数,在没进入函数前使用,会直接完成递归调用,若在递归执行过程中使用,则会返回它的上一层。

until+行号 执行到某行,用于小范围跳跃。

其他
disassemble 反汇编,显示指令附近的汇编代码
shell+指令 gdb界面执行linux指令


(三) vscode配置

1 ubuntu安装vmtools

目的:

  • 使下一步的vscode安装包能直接从windows桌面拖到虚拟机中,便于文件传输
  • 若不想使用windows下载然后传输到虚拟机上,也可以在ubuntu自带浏览器内直接进入vscode官网下载,可以跳过此步看2

步骤:

  • 虚拟机菜单栏->虚拟机->安装vmware tools->打开光盘映像->里面的文件VMwareTools.tar文件复制到桌面上
  • 打开终端,cd到桌面->解压命令:sudo tar -zxvf VMwareTools-X.X.X-590212.tar.gz,版本号使用tab自动补全->cd进入 vmware-tools-distrib文件夹
  • 安装命令:sudo ./vmware-install.pl 进入若遇到Do you still want to proceed with this legacy installer?[no] ,输入yes,之后一路回车直到安装结束。

若点击安装vmware tools提示:客户机操作系统已将 CD-ROM 门锁定,在上方菜单栏中进入虚拟机设置:
在这里插入图片描述
重新选择ubuntu的iso映像,多试几次,就能可以进入vmtools光盘映像了。

2 官网下载vscode linux版安装包

vscode官网地址
若ubuntu自带浏览器,直接搜vscode官网然后进入第一个网站即可
在这里插入图片描述

安装步骤:

  • windows下载的需要将安装包拖入虚拟机桌面
  • 进入ununtu终端,cd到安装包所在路径,即桌面
  • sudo dpkg -i code_1.78.2-1683731010_amd64.deb版本号用tab补全,以实际版本为主
  • 终端输入code打开vscode

插件:
若使用c/c++开发,推荐安装以下插件:

  • c/c++
  • cmake
  • cmake tools
  • chinese汉化插件视需求安装

插件下载


(四) Cmake编译工具使用

1 作用

CMake(cross platform make)是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。能通过写简单的配置文件生成本地的Makefile,并且跨平台的特性十分友好,非常方便。

2 常用参数
  • cmake_minimum_required(VERSION number)指定cmake最小版本要求

  • project(name)定义工程名称,还可指定工程支持的语言

  • add_executable(exename souucre1 soucre2...)生成可执行文件,可包含单个或多个cpp文件

  • include_directories(dir)向工程添加多个指定的头文件搜索路径

  • aux_source_directory(dir var)把指定目录下所有的源文件存储在一个变量中,常用于多文件编译

  • 调用变量时写法:${var},当使if时,直接加var

  • set(var source1 source2..)给源文件代码定义一个变量名字,方便使用

  • add_compile_options()添加编译参数,如-wall,-o,-std=c++11,中间用空格隔开。此命令还用于参与定义宏控制打印信息。

  • add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) 这个命令用于添加源文件子目录,同时还可以指定中间二进制和目标二进制的生成路径。外层的CMakeLists.txt使用add_subdirectory来控制其它目录下的CMakeLists.txt的运行

  • set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)控制make命令生成的可执行文件在主目录bin文件夹下。注意使用外部构建在build中运行cmake时,bin目录的路径位置一定要写对,../bin${PROJECT_SOURCE_DIR(意为根目录)}/bin,最好使用后者,方便别人阅读。若直接bin 会在build目录中创建一个bin文件夹。

  • add_library(lib_name lib_type soucre) 添加一个库,参数1为库名字,参数2位库类型动态还是静态默认静态,参数3位源文件

  • set(LIBRARY_OUTPUT_PATH${PROJECT_SOURCE_DIR}/lib)设置库文件存目录为lib,代码格式

  • set_target_properties: 设置最终生成的库的名称,还有其它功能,如设置库的版本号等

  • find_library(VAR_NAME LIB_NAME HINTS DIR)在指定目录下查找指定库,并把库的绝对路径存放到变量里,其第一个参数是变量名称,第二个参数是库名称,第三个参数是HINTS,第4个参数是路径,使用find能防止链接的时候才发现出错。此命令默认查动态库,若要指定查找库的类型,在第二个参数后加.so或.a

  • target_link_libraries (main LIB) 把目标文件与库文件进行链接,第一个参数为make生成的可执行程序,第二个为库文件,可用find生成的变量名代替

一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,库文件放到lib目录下,最终输出的可执行程序文件会放到bin目录下,这样整个结构更加清晰

3 CMake编译具体步骤
  • 编写CMakeLists:在main.cpp文件下建立CMakeLists.txt文档–>设置minimum,project,included_dir,add_executable等必要参数–>保存

  • 外部构建:在main.cpp同级目录创建build目录–>linux终端cd进入build目录–>输入命令cmake ..运行cmake–>生成makefile以及其它文件

  • 生成可执行文件:在linux终端中输入make命令–>./name执行


Logo

更多推荐