23-10-03总结[linux-c]
PS:个人感觉在Linux上面写C++/C还是很有趣的
gcc编译过程:
.c —> .i—> .s—> .o—> a.out
-e -s -c -o
命令:gcc [file] -o [target] (如果没有target,则默认生成a.out)
gcc参数有-g时会包含调试信息
静态库和动态库链接(变成库的好处:防止客户拿到核心代码)
静态库:可移植性强,兼容性好,但是文件体积大
静态库要求:lib开头,".a"结尾
step1:生成对应的.o文件
step2:用打包工具ar把.o文件打包为.a文件
ar rcs libxxx.a *.o #r更新 c创建 s索引
🐉 需要把头文件和.a文件一起发给客户
编译命令:gcc [测试文件] -L./ -I./ -l[库] -o [target]
(-L 所连接的库在哪里 -I 表明头文件在当前目录 -l 库名,要去掉前缀和后缀)
动态库:依赖动态库,简化升级,依赖版本严重
动态库要求:lib开头,“.so”结尾
step1:生成目标文件,要加-fPIC
gcc -fPIC -c add.c
step2: 生成共享库,要加-shared
gcc -shared *.o -o libxxx.so
🐲 编译命令和静态库相同 (但是需要配置环境变量,有点麻烦)
GDB调试工具
1.启动gbd:gdb [file]
2.设置参数:set args [ ] [ ] …
3.查看参数:show args
4.执行,停在第一个断点处(如果有):run
5.向下开始执行一行:start
6.显示10行代码:list
7.设置断点
1.b 10:在第十行设置断点
2.b [func]在函数入口设置
3.b [file]:9 if value == 10 条件断点
8.查看断点:i b
9.删除断点:delete [op]
10.下一步:next(n)
11.继续(直到碰到另外一个断点):continue
Makefile(主要用于维护和减少编译时间)
一条规则:
目标:依赖文件列表
命令列表
依赖文件:用于输入的文件
变量: a=b(放在文件最前面)
自动变量:$@:目标 $<:第一个条件 $^:所有条件
如果文件夹里面仅有.c和.o文件,下面的这个Makefile就不错
SRC=$(wildcard ./*.c)
OBJS=$(patsubst %.c,%.o,$(SRC))
target=test
$(target):$(OBJS)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
.PHONY:clean
clean:
rm -rf $(OBJS) $(target)