编译工具链
预处理 -》》 编译 -》》 汇编 -》》 链接
展开头文件 检查语法 生成二进制
宏替换 生成汇编
去掉注释
条件编译

-E预处理 -S -c生成目标文件
gcc -c hello.c //生成hello.o目标文件
gcc hello.o -o hello
gcc hello.c -o hello //直接运行
GCC其他选项
gcc -Wall main.c -o main //生成所有警告信息
gcc main.c -o main -DN //-DN文件开头添加宏define N
gcc main.c -o main -DN=value //-DN文件开头添加宏define N value
gcc main.c -o main -Idir //gcc/g++ 会先去-I 指定的目录去查找
条件编译
//作用于预处理阶段
#define DEBUG 1
#if DEBUG
...
#elif
...
#endif
defined标识符
#if defined(DEBUG)
#if defined DEBUG
#ifdef
#ifndef
条件编译作用
编写可移植程序
为宏提供默认定义
避免头文件重复包含
#ifndef _DEBUG_H
#define _DEBUG_H
...
#endif
临时屏蔽包含注释的代码
#if 0
...
#endif
调试
//GDB来进行调试
gcc hello.c -o hello -g //-g补充调试信息
gdb hello
//参数
gdb --args hello n1 n2 n3
//或者
gdb hello
set args n1 n2 n3
run
//查看源代码
进入(gdb)list
设置断点
gdb hello
break 20 //在第20行打断点
break main
break hello.c:20
break hello.c:main
//查看断点
info break
i b
//删除断点
delete 2 //删除第2行断点
d //删除所有断点
//启动调试
run
r
//继续
c (continue)//运行到逻辑上的下一个断点
//忽略断点n次
ignore 1 10 //忽略1号断点n次
//单步调试
step
//逐过程next
n
//跳出子函数
finish
监视
(gdb) print/p
print PI*r*r
print r
print r=2.0
display r //自动展示expression 表达式的值
info display //自动展示的表达式
undisplay //删除自动展示的表达式
info locals //查看函数中所有局部变量的值
info args //查看函数参数
//查看内存
x/nFU
Coredump 程序意外终止产生的日志
//查看系统是否生成Coredump文件
ulimit -a
//设置Coredump文件的格式
sudo vim /etc/sysctl.conf
sudo sysctl -p //让配置生效
gdb test test_core_8_2345134 //test程序异常后产生日志Coredump
(gdb)bt //查看栈调用情况backtrace
frame[n] //
info locals //查看函数中所有局部变量的值
info args //查看函数参数
静态库和动态库
//生成静态库
gcc -c add.c
gcc -c sub.c
gcc -c mul.c
gcc -c div.c
//把目标文件打包成静态库
ar crsv libalgs.a add.o sub.o mul.o div.o # 静态库一般以.a结尾,
mv libalgs.a /usr/lib
//生成动态库
gcc -c add.c -fpic
gcc -c sub.c -fpic
gcc -c mul.c -fpic
gcc -c div.c -fpic
//把目标文件打包成动态库
gcc -shared add.o sub.o mul.o div.o -o libalgs.so
mv libalgs.so /usr/lib
Makefile
//makefile 增量编译的效果,只编译修改的文件
vim Makefile
//格式
[目标]:[依赖]
[command]
main: main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o main
main.o: main.c algs.h
gcc -c main.c -Wall -g
add.o: add.c algs.h
gcc -c add.c -Wall -g
sub.o: sub.c algs.h
gcc -c sub.c -Wall -g
mul.o: mul.c algs.h
gcc -c mul.c -Wall -g
div.o: div.c algs.h
gcc -c div.c -Wall -g
//伪目标
.PHONY: clean rebuild #避免有clean重名文件
clean:
rm -f main main.o add.o sub.o mul.o div.o
rebuild: clean main
$ make clean # 清除可执行程序和所有的目标文件,make可以指定要执行的目标。
$ make rebuild
练习:在一个目录有多个.c文件,将每个文件单独编译链接,生成可执行程序
vim Makefile
//
Srcs := $(wildcard *.c)
Exes := $(patsubst %.c, %, $(Srcs))
CC := gcc
CFLAGS := -Wall -g
.PHONY: Out clean rebuild
out:$(Exes)
%:%.c
$(CC) $^ -o $@ $(CFLAGS)
clean:
$(RM) $(Exes)
rebuild: clean Out