Linux03编译工具

Posted by 川川的博客 on May 4, 2025

编译工具链

预处理 -》》 编译 -》》 汇编 -》》 链接

展开头文件 检查语法 生成二进制

宏替换 生成汇编

去掉注释

条件编译

image-20250611143914871

-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