编译链接
GCC的编译步骤
gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:
四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程,其中编译最耗时,因为要逐行检查语法.
下面以test.c为例介绍gcc的四个步骤:
gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -c test.s -o test.o
gcc test.o -o test
一步生成最终的可执行程序:
gcc test.c -o test
GCC常用参数
-v
查看gcc版本号,--version也可以-E
生成预处理文件-S
生成汇编文件-c
只编译,生成.o文件,通常称为目标文件-I
指定头文件所在的路径-L
指定库文件所在的路径-l
指定库的名字-o
指定生成的目标文件的名字-g
包含调试信息,使用gdb调试需要添加-g参数-
On n=0∼3
编译优化,n越大优化得越多- 例如:下面代码片段c
int a = 10; int b = a; int c = b; printf("%d",c);
- 上面的代码可能会被编译器优化成:c
int c = 10; printf("%d",10);
- 上面的代码可能会被编译器优化成:
- 例如:下面代码片段
-Wall
提示更多警告信息- c
int a; int b; int c = 10; printf(“\[%d\]\n”,c);
- 编译如下:
- shell
gcc -o test -Wall test.c warning: unused variable ‘b’ [-Wunused-variable] warning: unused variable ‘a’ [-Wunused-variable]
-D
编译时定义宏- test.c文件中的代码片段:
printf("MAX==[%d]\n",MAX);
- 编译:
- shell
gcc -o test test.c -D MAX=10 # 相当于#define MAX=10 gcc -o test test.c -DMAX=10
- test.c文件中的代码片段:
-v
打印编译器的版本信息
编译链接相关命令
汇编
as 源文件 -o 目标文件(一般以.o结尾)
as test.c -o test.o
链接
使用ld命令可以调用静态链接器,把调用的函数和地址关联起来。ld可以把多个 .o
文件、库文件、os引导代码合并起来生成最终的可执行程序。
ld 汇编文件(一般以.o结尾) [其他库文件] -o 目标文件
ld test.o -o test
查看依赖
查看ls程序的依赖关系(ldd只能检查动态依赖)
ldd /bin/ls
查看汇编文件
源文件经过汇编之后生成的 .o
文件使用vim打开之后格式是乱的,我们可以使用下面的命令来调整其格式方便我们查看
# 格式化
:%!xxd
# 取消格式化
:%!xxd -r
列出函数
从目标文件中列出符号表
nm 目标文件
nm test.o
nm test
GDB调试
- GDB是一个功能强大的命令行调试工具,用于在程序运行时跟踪、检查和修改程序的执行过程。
- GDB主要用于调试C、C++等语言编写的程序,通过设置断点、单步执行、查看变量等方式来定位并解决程序中的问题。
- GDB是程序员在开发过程中必不可少的工具之一,可以大大提高调试效率。
想更深入地了解GDB调试,可以从以下几个方面入手:
- 断点设置: 在程序的特定位置设置断点,让程序在执行到该处时暂停。
- 单步执行: 一行一行地执行程序代码,观察程序的运行状态。
- 变量查看: 查看变量的值,检查变量是否按预期变化。
- 堆栈跟踪: 查看函数调用栈,分析程序的执行流程。
GDB调试的优点:
- 功能强大: GDB提供了丰富的命令,可以满足各种调试需求。
- 灵活高效: GDB可以对程序进行细粒度的控制。
- 跨平台性: GDB可以在多种操作系统上使用。
碍于篇幅限制,更详细的关于GDB调试信息请参考 点击跳转
如果你想了解更多关于GDB调试的信息,可以参考以下资源:
Makefile自动化编译
Makefile文件中定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
Makefile带来的好处就是——“自动化编译”,一旦写好只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake、Linux下GNU的make。可见,Makefile都成为了一种在工程方面的编译方法。
Makefile文件中会使用gcc编译器对源代码进行编译,最终生成可执行文件或者是库文件。
Makefile文件的命名:makefile
或者Makefile
Makefile的核心是。
以上只是Makefile自动化编译的简单介绍,详细使用请参考
wd54期中编译链接调试的课件 点击查看