【Linux C】vim/gcc/gdb/make

嵌入式文本编辑器vim

命令行模式

插入模式:

  1. 【x】:删除光标“后面”一个字符(我才直到有这个快捷键。。emm是我没有好好听课吧)
  2. 【X】:删除光标“前面”一个字符
  3. 【yw】:光标处到子尾的字符复制到缓冲区
  4. 【u】:回复上一次操作/多按可执行多次回复

底行模式:

  1. 【set nu】:列行号
  2. 【/关键字】:如果第一次找的不是想要的关键字,按n寻找
  3. 【?关键字】:同上
  4. 【noh】:取消高亮(有时候会误操作,这个有可能会常用)

嵌入式编译器gcc

          预处理器                  编译器                 汇编器                 链接

              -E                            -S                        -c                         

源文件  ——>  预处理文件  ——>  汇编文件  ——>  目标文件  ——>  可执行文件

.c/.cc/.cxx           .i/.ii                           .s                          .o                          .out

(1)总体选项:

  1. -c:编译或汇编源文件
  2. -E:预处理源文件
  3. -S:编译源文件
  4. -o file:指明输出名为file

(2)警告选项:

  1. -W:屏蔽所有的警告信息
  2. -Wall:显示所有类型的警告信息
  3. -Werror:出现任何警告就停止编译

(3)调试选项:

  1. -g:产生调试信息(gdb)

(4)优化选项:

  1. -o1:优化1
  2. -o2:优化2(提高目标文件的运行性能)
  3. -o3:优化3(支持函数集成优化)
  4. -o0:不优化

(5)目录选项:

  1. -I dir:指定头文件搜索目录dir
  2. -Ldir:指定搜索目录dir

(6)连接器选项:

  1. -static:静态链接
  2. -l库名:链接库文件
  3. -L dir:指定连接器的搜索目录dir
  4. -shared:生成共享文件

预处理(例:test.c -> test.i)

gcc在编译时首先把头文件中的内容加载到*.c的首部

编译(例:test.i -> test.s)

编译阶段是整个编译过程中最复杂的一个阶段。编译的三个步骤:

  • 词法分析(关键字、标识符是否正确)
  • 语法分析(语句的语法是否正确)
  • 语义分析(语句的逻辑意义是否正确)

汇编(例:test.s -> test.o)

汇编阶段是把汇编程序翻译成cpu可以识别的二进制文件(即目标文件)

在window系统中目标文件后缀是.obj

链接(例:test.o -> test.out)

链接阶段是把程序中所有的目标文件和所需的库文件链接在一起,最终生成一个可以直接运行的文件,成为可执行文件

可执行文件

  1. a.out
  2. COFF
  3. ELF:Linux平台上可执行文件的主流格式

函数库

静态链接 编译系统在链接阶段把程序的目标文件和所需的函数库文件连接在一起(可执行文件可以在没有函数库情况下运行) 产生的可执行文件体积大 运行效率高
动态链接 在程序运行,需要使用时才链接函数库 产生的可执行文件体积小 运行效率低一点

C程序在调用Glibc中的函数库时,需要引用与函数库对应的头文件(如:stdio.h/string.h/time.h)

在编译命令中需要加入某些函数库的链接参数(在函数库的使用文档中会列出具体的链接库名称参数),并使用-l进行连接

Glibc函数库文件

  1. /lib目录:主要是给/bin目录下的系统程序使用
  2. /usr/lib目录:主要是给/usr目录下的用户程序使用的
  Linux后缀名 Windows后缀名 说明
静态库文件 .a .lib

“statically linked”

静态库就是在可执行文件中包含库代码的一份完整拷贝

动态库文件(记录库文件信息 .la    
动态库文件 .so .dll

“dynamically linked”

动态库的符号链接文件会写入二进制文件中,这样在运行时即可通过符号链接文件找到指定的动态库文件

(1)生成静态库

1、将hello.c编译成hello.o(静态库和动态库都是由.o文件生成)

2、为了遵循linux中静态库的命名规范,静态库命名为libhello.a

3、将main.c与静态库连接,生成可执行文件:“main”

4、运行

(2)生成动态库

1、

2、

3、运行

嵌入式调试器GDB

常用命令:

  1. l(list):查看源文件(以10行为单位)
  2. b(br):设置断点(通过断点知道程序每一步的执行状况:当前变量的值、函数是否调用、堆栈使用情况)
  3. info b:查看断点情况
  4. r:运行程序
  5. s:单步运行
  6. n:逐语句执行
  7. c:继续运行程序(再次在断点处暂停)
  8. p(p var_):查看变量值
  9. bt(backtrace):列出调用栈

工程管理器Make

仅使用gcc对程序编译非常低效,原因:

  1. 源文件的个数越多,gcc的命令行越长,各种编译规则也会加大gcc命令行的复杂度,所以在开发调试程序的过程中,通过输入gcc命令行来编译程序是很麻烦的
  2. 在调试过程中,每次调试一般只会修改部分的源文件,而gcc会把那些没有被修改过的源文件一起编译,这样会影响编译的总体效率

gcc提供了半自动化的工程管理器Make。

  • 半自动化:在使用工程管理器前需要人工编写程序的编译规则,所有的编译规则都保存在Makefile中。
  • 全自动化:编译程序前自动生成Makefile文件

Make的优越性:

  1. 使用方便:通过命令“make”即可启动Make工程管理器对程序进行编译。Make启动后会根据Makefile文件中的编译规则命令自动对源文件进行编译和链接,最终生成可执行文件。
  2. 调试效率高:只有在上次编译之后被修改的源文件才会在接下来的编译过程中被编译和链接,避免多余的编译工作量。为了保证源文件具有正确的时间戳,必须保证操作系统的时间正确性。

猜你喜欢

转载自blog.csdn.net/qq_42417182/article/details/88655653