Linux 基础开发工具

一.Linux编译器-gcc/g++

1. 背景知识
1.预处理(进行宏替换)
2.编译(生成汇编)
3.汇编(生成机器科识别代码)
4.链接(生成可执行文件或程序)
2. gcc 如何完成
预处理 ( 进行宏替换 )
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行.
实例:gcc -E main.c -o main.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查 无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc -S main.i -o main.s
汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc -c main.o -o main.o
链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
实例: gcc main.o -o main
在这里涉及到一个重要的概念 : 函数库
在c语言中并没有定义“printf”函数的实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而并没有定义该函数的实现,那么是在哪里实现printf函数的?这时候就用到函数库。
系统将这些函数的实现都做到一个lib.so.6的库文件中,在没有特别指定时,gcc会到系统默认的路径下查找,也就是链接到lib.so.6库函数中去,就可以实现printf函数了。
函数库一般分为静态库和动态库
静态库:将库中使用到的函数直接写入到可执行程序中,生成的可执行程序大,内存中会有冗余                  代码,但是不会产生运行依赖。
动态库:将库中函数的符号信息表记录到可执行程序中,生成的可执行程序较小,内存中没有冗                  余代码,但会产生运行依赖。 
gcc编译器默认链接方式:动态链接

二、gdb调试器

1.背景知识
程序的发布方式有俩种:debug 和 release,在LLinux gcc/g++出来的二进制程序,默认是release模式,在release模式下不能进行调试,所以 要使用gdb调试时候,必须要在生成二进制程序的时候加上  -g  选项
gcc -g main.o -o main
2.gdb调试命令
(1)加载程序:gdb ./main
(2)开始调试:start  run(开始运行)
(3)逐步调试:next (相当于c语言中F10)       step(相当于c语言中F11)
                           until main.c:5  (直接运行到main.c的第5行)
                           list main.c:5    (查看main.c的第5行附件的代码)
(4)断点调试:break main.c:8   (在main.c的第8行设置一个断点)
                           break 函数名      (直接在函数上设置断点)
                          ​​​​​​​  info break           (查看断点信息)
                           delete 编号         (删除断点)
                           print 变量=10      (查看或者设置变量信息)

 

三、make&makefile (项目化自动构建工具)

1.背景知识

在gcc/g++下,要想得到可执行程序,需要经过预处理,编译,汇编,链接这四步,如下:

 

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
makefifile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完动编
译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefifile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefifile都成为了一 种在工程方面的编译方法。
make是一条命令,makefifile是一个文件,两个搭配使用,完成项目自动化构建。
Makefile编写:目标对象:依赖对象
                                          【tab键】规则指令

 

make解释规则:

1.make查找第一个目标对象(Makefile中第一个对象),作为生成最终对象

2.检测依赖对象和目标对象的时间关系,判断目标对象是否需要重新生成

目标对象不存在,需要重新生成          目标对象存在后依赖对象重新修改,目标对象重新生成

(若目标对象需要生成,但依赖对象不存在,则会先生成依赖对象)

3.make在完成终极目标对象后,即Makefile中第一个对象,就会结束退出,因此,如果后面还有其他对象,不是目标对象的依赖对象,则不会生成,需要通过make指令指定生成

例:

在执行make时,并没有生成Makefile中的clean 这条命令,只生成了终极对象main。所以,要想生成clean目标对象,需要我们指定生成 make clean

4.(.PHONY)

当我们在Makefile之外有一个已存在的文件clean和Makefile中的目标对象clean重复时,我们在用make clean 指定生成clean这个对象时,则不会生成:

那么怎么才可以生成Makefile中的clean,这时候就需要将其声明为:.PHONY:clean(将clean声明为伪对象),它的作用是:与外部的实际文件解除关系,表示这个对象无论如何都要被执行生成

 四、简单进度条小程序

 

 

对于上述程序printf("%-51s--[%d]\r",buf,i*100/50);这条语句,\r为回车符,意为让光标跑到行首,与\n不相同

在Linux中,一切东西都会被当做文件操作,打印其实是将数据交给显示器,然后显示器进行显示,向文件中写入数据,并不是直接将数据写入文件中,而是把数据放在缓冲区里边,等到缓冲区的数据满了或者刷新缓冲区的时候再把数据一次写入文件,当用\n和fflush进行操作时,不管缓冲区是否已满,都会刷新缓冲区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值