一个源代码要成为一个可执行程序,需要经过编译器的编译、链接。
在Linux中的编译器主要有两种:gcc 、 g++ ;gcc主要用于编译C代码;g++用于编译C++代码。
那如何查看编译的三个小过程呢?
通过上图,可以看到生成了一个.i文件;命令:gcc -E test.c -o test.i
解释:gcc 表示用gcc编译器编译 ; -E 是表示将源文件在预处理完成后便停止;-o 用来确定输出文件名称的
预处理完成后保存到 test.i中。
命令:gcc -S test.i -o test.s
解释:-S 表示进行到“编译”完成后就结束,
命令:gcc -c test.s -o test.o
解释:-c 表示进行到汇编完成后就结束,
这三个过程中的ESc可以通过键盘的退出键“Esc”进行联想记忆,但需注意大小写问题。
在写代码的时候往往要用到各种库函数;那么要使用这些库函数,便需要链接这些库。
在写代码的时候往往要用到各种库函数;那么要使用这些库函数,便需要链接这些库。
库可以分为:动态库、静态库
动态库:资源的利用率高,但程序的执行需要依赖第三方库 (.a)
静态库:程序不依赖任何第三方库; 可移植性好,但太占资源 ( .so )
那么gcc编译程序时用的是哪种链接库?
查看文件所链接的库:
命令: ldd 可执行文件
例如:
Linux下的库文件命名中 : lib 表示库 ; .a 或 .so 表示其属性(静态或动态);通过上图可发现其 是名为 c 的动态库; Linux下头文件和库文件默认目录 :头文件 (.h): /usr/include/目录 ;库文件 (.so, .a): /usr/lib/目录
如果想让一个程序静态链接的话,可以在编译的时候加上 -static 命令;
在gcc编译器下默认采用的是动态链接和 Release版本;gdb是调试工具,只能在Debug版本下进行调试。
在编译的时候使用 -g 选项便可以是程序的执行环境为Debug;
Release版本:
Debug版本:
可以看出Release版本是经过优化的。
进入调试界面:命令 :gdb 可执行文件
功能: 显示代码
命令: l 行号 // 显示某行代码 l 是 list的简写
l l 文件名:函数名 //某一个函数
功能: 打断点
命令 : b 行号 // 在某一行打断点,break port 打断点
b 函数名(main)
b test.c:sum //在test.c 的sum函数出打断点
功能: 查看断点
info b //查看断点
功能: 删除断点
命令: d 断点编号 //delete port 删除断点
功能: 运行程序
命令: r //run 停在断点
功能: 执行下一条过程
命令: n //next (逐过程调试)
功能: 进入函数
命令: s //step(逐语句调试)
功能: 查看变量的值
命令: p 变量名
display 变量名 // 常显示
undisplay 序号(变量的序号) //去常显示
说明: gdb指令有记忆功能(回车执行最近的指令),display变量之后会不断显示这个变量的值
功能: 关闭断点
命令: disable 断点号 //屏蔽该端点
功能: 开启断点
命令: enable 断点号 //解屏蔽
功能: 设置某个变量的值
生成索引文件 命令:ctags –R .
“-R”表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录。“*”表示所有文件。这条命令会在当前目录下产
生一个“tags”文件,当用户在当前目录中运行vi时,会自动载入此tags文件。Tags文件中包括这些对象的列表:用#define定
义的宏枚举型变量的值函数的定义、原型和声明名字空间(namespace)类型定义(typedefs)变量(包括定义和声明)类
(class)、结构(struct)、枚举类型(enum)和联合(union)类、结构和联合中成员变量或函数VIM用这个“tags”文件来
定位上面这些做了标记的对象。
" Ctrl键和 右中括号 ] " 便可以进入这个函数内部 (相当于VS中的转到函数定义);
“ Ctrl键 和 t ”便可以返回到函数声明(相当于VS中的转到函数声明);