gcc编译器
名称:GNU Compiler Collection
对C/C++编译的控制
- 预处理 Pre-Processing 生成 .i 文件
gcc -E -o hello.i hello.c
- 编译 Compiling 生成 .s 文件
gcc -S -o hello.s hello.i
- 汇编 Assembling 生成 .o 文件
gcc -c -o hello.o hello.s
- 链接 Linking
gcc -o hello hello.o
gcc提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。gcc通过文件后缀名来区别输入文件的类别.
gcc常用选项及常见的文件格式,扩展名_
选项 | 含义 |
-o filename | 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果filename没有指定,缺省文件名是a.out |
-c | 只编译不链接,生成目标文件.o |
-S | 只编译不汇编,生成汇编代码 |
-E | 只进行预编译 |
-Wall | 在发生警告时取消编译操作,即将警告看作是错误 |
-w | 禁止所有的报警 |
-g | 在生成的可执行程序中包含标准调试信息 |
-v | 查看gcc编译器的版本,显示gcc执行时的详细过程 |
-O | 优化代码 |
-pedantic | 在使用了扩展语法的地方将产生相应的警告信息 |
gdb调试器
Linux下的GDB(GNU Debugger)是一个用来调试C、C++程序的功能强大的调试器,它能够在程序运行的过程中观察程序的丙部结构和内存的使用情况。程序员也可以使用gdb来跟踪程序中的错误,从而减少了程序员的工作量。
- 设置断点
- 单步执行程序
- 查看程序中变量值的变化
- 动态改变程序的执行环境
- 分析崩溃程序产生的core文件
gdb是一个命令行方式的调试工具,它不同于我们在Windows下常见的Turbo C,VC等图形化程序开发工具。gdb的使用非常简单,只要在Linux的命令提示符下输入gdb,系统便会启动gdb。也可以在gdb后面给出文件名,直接指定想要调试的程序,gdb就会自动调用这个可执行文件进行调试。命令形式如下:
#gdb filename
为了使gdb 正常工作,必须使程序在编译的时候包含调试信息,这需要在gcc编译时加上-g或者-ggdb选项。调试信息包含了程序中的每个变量的类型和在可执行文件中的地址映射以及源代码的行号。而gdb正是利用这些信息使源代码和机器码相关联。
linux下gdb调试方法与技巧整理_
命令 | 含义 |
file | 装入想要调试的可执行文件 |
run | 执行当前被调试的程序 |
kill | 终止正在调试的程序 |
list | 列出产生执行文件的源代码 |
quit | 退出gdb |
break | 设置断点,将程序执行到这里时被挂起 |
step | 执行一行源代码而且进入函数内部 |
next | 执行一行源代码但不进入函数内部 |
打印、赋值 | |
display | 设置自动显示的表达式或变量,当程序停住或在单步跟踪时,这些变量会自动显示其当前值 |
backtrace | 回溯跟踪 |
frame n | 定位到发生错误的代码段,n为backtrace命令的输出结果中的行号 |
make和makefile
target ... : prerequisites ...
command
...
...
target:可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。
prerequisites :生成该target所依赖的文件和/或target
command:该target要执行的命令(任意的shell命令)
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
声明一个变量,objects/objs等表示obj文件
例如:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
make自动推导
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个 .o
文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个 .o
文件,它就会自动的把 .c
文件加在依赖关系中,如果make找到一个 whatever.o
,那么 whatever.c
就会是 whatever.o
的依赖文件。并且 cc -c whatever.c
也会被推导出来。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
指定特定的Makefile,你可以使用make的 -f
和 --file
参数,如: make -f Make.Linux
或 make --file Make.AIX
。
引用其它的Makefile
在Makefile使用 include
关键字可以把别的Makefile包含进来
make的工作方式
GNU的make工作时的执行步骤如下:(想来其它的make也是类似)
- 读入所有的Makefile。
- 读入被include的其它Makefile。
- 初始化文件中的变量。
- 推导隐晦规则,并分析所有规则。
- 为所有的目标文件创建依赖关系链。
- 根据依赖关系,决定哪些目标要重新生成。
- 执行生成命令。