Linux

    • 一 初识linux
      • (一) Linux组成
        • 1 Linux内核
        • 2 GUN工具
        • 3 图形化桌面环境
      • (二) 了解Shell
        • 1 CLI命令行界面
        • 2 使用虚拟机
        • 3 Finalshell,Xshell
        • 4 Linux虚拟文件目录
      • (三) 基本shell指令
    • 二 linux下c/c++开发
      • (一) 使用GCC编译器
        • 1 g++参数:
        • 2 具体案例
      • (二) 常用GDB调试命令参数
      • (三) vscode配置
        • 1 ubuntu安装vmtools
        • 2 官网下载vscode linux版安装包
      • (四) Cmake编译工具使用
        • 1 作用
        • 2 常用参数
        • 3 CMake编译具体步骤

一 初识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" />二 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" />
      重新选择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执行