14、系统编程 基础工具

1.GCC
  • 编译C语言用gcc,编译C++用g++

  • 文件类型及后缀

    • 原代码:test.c 、test.cpp

    • 预处理后的代码:test.i

    • 汇编代码:test.s

    • 二进制文件:test.o

      (可执行文件:.out 、.exe)

    • 核心关系:通过编译,成为汇编代码,再通过汇编,成为二进制文件

  • 文件之间的关系和它们的指令(不要死记硬背)

    • gcc test.c :生成 默认的可执行文件a.out
    • gcc test.c -o abc :生成 名为 abc 的可执行文件
    • gcc test.c -E -o test.i:生成 名为 test.i 的预处理文件
    • gcc test.i -S -o test.s:生成 名为 test.s的汇编文件
    • gcc test.s -c -o test.o:生成 名为 test.o的二进制文件
    • gcc test.s -s -o test.o:生成吗名为test.o的二进制文件并链接,及生成名为test.o的可执行文件
    • gcc test.c -c -o test.o:可以直接从原代码变成可执行文件,中间过程都是可以跳跃的(直接跨到可执行文件的话,-c也可省略)
    • 补充:
      • gcc test.c -Wall:生成警告信息
      • gcc test.c -On:n为(0,1,2,3),表示不同等级的优化,主要为了防止反汇编(O1是默认等级)
      • gcc test.c -std=99:表示编译C语言的版本为C99
2.静态库、动态库

在这里插入图片描述

  • 静态库的建立:

    1. 先使用 gcc add.c div.c mult.c -c ,生成 链接后的可执行文件,得到add.o,div.o,mult.o
    2. 再使用 ar rcs libcalc.a add.o div.o mult.o,将可执行文件打包到静态库calc
  • 静态库的使用:

    gcc main.c -o app -Ⅰ ./include -L ./lib -l calc

    • gcc main.c -o app 表示由main.c 生成一个可执行文件 app
    • -Ⅰ ./include 表示 加入 头文件的路径
    • -L ./lib 表示 加入 要使用的静态库的路径
    • -l calc 表示 要使用的静态库的名称

  • 动态库的建立:

    1. 先使用 gcc add.c div.c mult.c -c -fpic,多加了-fpic(必须有),表示生成 和位置无关的代码
    2. 再使用 gcc -o libcalc.so add.o div.o mult.o -shared,将可执行文件打包到动态库,注意后面有一个 -shared
      在这里插入图片描述
  • 动态库的使用——使用前必须 配置路径(可通过ldd查看是否配置完成),方法如下:

    1. DT_RPATH段(不考虑)

    2. 配置环境变量 LD_LIBRARY_PATH

      • export LD_LIBRARY_PATH = $LD_LIBRARY_PATH :/home/nowcoder/Linux/lesson06/lib(动态库的pwd)

      • 直接在当前终端写,那么作用范围仅限当前这一个终端窗口

      • ~/.bashrc 中写,还是一样的内容,但作用范围在所有终端窗口(写完之后还需要用source .bashrc 或 . .bashrc才能生效)

    3. 配置 /etc/profile

      • export LD_LIBRARY_PATH = $LD_LIBRARY_PATH :/home/nowcoder/Linux/lesson06/lib(动态库的pwd)
      • 写之前:sudo vim /etc/profile;写之后:source /etc/profile
      • 方法2是用户级别的配置,而方法3是系统级别的配置
    4. 配置 /etc/ld.so.cache

      • 直接把 动态库的路径(pwd)更新到这个文件中即可
      • 写之前:sudo vim /etc/ld.so.conf;写之后:sudo ldconfig
    5. /lib/、/usr/lib目录(不建议,因为可能覆盖系统自带的动态库)

      img

  • 动态库的使用——使用时要同时指明头文件的路径、动态库的路径、库的名字:

    gcc main.c -o app -Ⅰ ./include -L ./lib -l calc

    • gcc main.c -o app 表示由main.c 生成一个可执行文件 app
    • -Ⅰ ./include 表示 加入 头文件的路径
    • -L ./lib 表示 加入 要使用的 动态库的路径
    • -l calc 表示 要使用的 动态库的名称
      在这里插入图片描述
3.Makefile
  • 定义:用于 统一编译 的工具,在 Makefile 里面写好 该怎么编译,然后输入make,即可直接运行当前文件夹里的 Makefile,实现统一编译

  • 怎么写:

    main:add.c div.c

    gcc add.c div.c -c -o main

    • main 为 目标,add.c div.c 为 依赖,gcc add.c div.c -c -o main 为 指令
    • 指令前必须要有缩进
  • 特性:

    • Makefile 里可以有 多条编译规则,但是其他的规则 必须能为 第一条规则服务。如果不能,那么这条规则就不会执行,只 执行第一条规则

      • 如图,其他规则都是为第一条规则提供服务

    • 检查更新:当 Makefile 中的依赖没有更新时,使用 make命令,就不会使用 Makefile 了,因为这时main.o已是最新

  • 优化:

    • 变量

      • 定义方法和一些特殊符号
        在这里插入图片描述

      • 实际例子

在这里插入图片描述

  • 模式匹配

    • 和上图是同一个例子。用模式匹配了,就不需要那么多辅助的规则了

在这里插入图片描述

  • 函数

    • wildcard 作用是找到并展示所有符合条件的文件,使用:$(wildcard 文件1 文件2)

    • 在这里插入图片描述

    • patsubst 作用是转变类型,只要符合条件就行,使用:

在这里插入图片描述

​ 表示如果 x.c 和 bar.c 符合 %.c,那么就将它们转换为 %.o 类型的

  • 汇总(如果没有疑问,说明都掌握了,附:clean的用法)

    在这里插入图片描述

4.GDB
  • 定义:一个调试工具

  • 使用:

    1. gcc test.c -c -o test -g,在正常的指令后面要加一个 -g,从而让可执行文件test 含有 test.c的信息
    2. gdb test 即可
  • 简单命令——查看

  • 核心命令——断点、调试
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值