1.准备

gcc使用

1.gcc编译流程:
1)预处理:gcc -E
2)编译:gcc -S
3)汇编:gcc -c
4)链接:没参数
5)其他参数:-o:指定输出名字,-D:编译时定义宏,-I:指定头文件,-g:gdb调试,-O:编译优化,可选(1-3),-Wall:输出警告信息

静态库

1.命令规则:lib+静态库的名字+.a,(lib是规范前缀,.a是规范后缀)。eg:libmytest.a
2.制作方法:
1).生成一个或多个.o文件,
2).将.o文件打包:ar rcs libmytest.a one.o two.o。(ar是打包工具,rcs是命令,libmytest.a是包名,剩下的是.o文件)
3.发布静态库
1).发布静态库
2).给出头文件
3.使用静态库:gcc test.c -l hello -L. -static -o hello.static ,以.o文件为单位抽取库里面的文件使用,而不是把整个库一起编译进去
4.静态库的优点:
1).发布程序时,不需要提供对应的库
2).程序执行时,加载速度快
5.静态库的缺点:
1).库很大
2).库发生变化,需要重新编译

动态库

1.命令规则:lib+动态库名字+.so
2.生成动态库
1).生成与位置无关的.o文件:gcc -fPIC -c *.c
2).打包成动态库:gcc -shared -o libMytesst.so *.o -I include
3.使用动态库
1).gcc main.c lib/libMytest.so -o app -I include
2).gcc main.c -I include -L lib -l Mytest -o app
3).ldd命令:查看程序依赖的所有动态库
4.解决无法打开动态库的错误,问题核心是:动态库所在位置没有设置环境变量,所以无法找到动态库
1).将动态库放入系统的lib目录(实际坚决不用)
2).系统默认的动态库目录由环境变量:LD_LIBRARY_PATH,只需要将动态库所在路径加入这个环境变量(可用)
3).修改:/etc/ld.so.conf文件,将动态库所在路径加入到文件中(推荐)
4).修改家目录的.bashrc代码,加入export环境变量导入语句(不常用)
5.动态库的优点:
1).可执行程序小
2).只要函数接口不变,动态库发生变化,不用重新编译程序
6.动态库的缺点:加载慢,程序执行前,需要准备好动态库

gdb简单使用:

1.gdb app,调试程序app,进入调试界面
2.命令:l,默认查看main.c文件,l filename.c,查看指定的文件,l filename.c:funcion_name:查看指定文件的函数代码,l filename:行号:查看指定文件的行
3.命令:break 22:在22行打断点(简写:b 22),可以连续打断点。(断点不能停在for循环上)
4.命令:b 22 if i =15,当变量i=15时,代码才停止,条件断点
5.命令:info bbreak:查看断点信息,(简写:i b),info display:获取追踪变量编号(i d)
6.命令:

start:开始执行程序,(run命令也是一样,(简写:r))
n:继续执行一步,不可进入函数体内部
c:直接执行至断点,
s:也是继续下一步,它可进入函数体内部,
l:可查看函数体内部代码,
p 变量名:查看变量的值,
ptype 变量名:查看变量的类型,
dispalay 变量名:追踪变量的值变化,
undisplay 追踪编号:取消某个变量的追踪
u:跳出单次循环
delete 断点编号:删除断点
finish:跳出函数,(跳出前,必须先删除函数内部的所有断点)
set var i = 10:直接设置变量i的值为10
quit :退出调试

Makefile

1.命名方式:makefile或者Makefile
2.Makefile规则三要素:目标,依赖,命令
示例:app:main.c
[tab] gcc main.c -o app
3.makefile分开编译,哪个被修改了才编译,不修改的不编译

app:main.o, one.o
    gcc main.o one.o -c app
main.o:main.c
    gcc -c main.c
one.o:one.c
    gcc -c one.c

4.makefile示例

#行注释符
#变量定义
#obj = main.o one.o
#函数:获取当前目录中所有的.c文件名
src = $(wildcard ./*c)
#将:src中的,所有.c文件名,替换成.o,参数之间要用逗号隔开
obj = $(patsubst ./*.o, ./*.c, $(src))
target = app
CC = gcc
#CC这种大写的变量是makefile自身维护的变量,值可修改
$(target):$(obj)//变量使用$(var)
     #$(CC) $(obj) -o $(target)
    $(CC) $^ -o $@,
    #$^表示所以依赖,$@表示目标,$<表示第一个依赖,它们是自动变量,只能用于命令中
%.o:%.c
#%表示匹配依赖
    $(CC) -c $^ -o $@ 
.PHONY:clean #声明目标clean为伪目标,之后就不会做更新比较
clean:
#命令前面加一个:-,表示忽悠错误,继续向下执行
    -rm $(obj) $(target) -f #书写一个与终极目标无关的目标,make clean手动调用目标,执行目标下面的命令

你可能感兴趣的:(1.准备)