GCC编译
多文件编译
1、将所有的.c文件生成.o文件
2、生成可执行文件
gcc执行过程
1、gcc -c main.c -o main.o -I ../header
-c:指定生成.o文件
-o:指定生成文件的名字
-I:指定包含头文件的路径
2、gcc -o main main.o add.o
将main.o和add.o生成目标文件(可执行文件)main
3、执行文件
./main
第三方库
静态链接库和动态链接库(共享库)
如果动态库和静态库同时存在的场合下,(同名库)优先选择动态库。
1、生成静态链接库
gcc -o mySort.o -c mySort.c -I ../header/
ar -rv -o libmySort.a mySort.o
gcc -o main.o -c main.c -I ../header/
gcc -o main main.o -L./ -lmySort
./main
说明:
1、生成静态库的指令 ar -rv
2、指定静态库 libmySort.a ,其中lib和.a不可以改变
3、-L:搜索第三方库的路径
4、-lmySort:加载静态库libmySort.a
2、生成动态链接库
gcc -fpic -shared -o libmySort.so mySort.o
gcc -o main main.o -L./ -lmySort
说明:
1、-fpic:生成位置无关的代码
2、-shared :指令生成动态库
3、lmySort:加载动态库libmySort.so
注意:
此时执行./main 失效,原因无法查找链接的动态库,默认的执行路径为/lib。
解决方式1:
将libmySort.so移动到/lib下
解决方式2:
vi ~/.bashrc 修改设置环境变量
xport LD_LIBRARY_PATH=/home/neusoft/桌面/demo01/source/lib(指定的.so文件的路径,比如我的是存放在了/home/neusoft/桌面/demo01/source/lib路径下)
gdb调试
gdb调试逻辑的错误。
调试步骤:
-g
gdb 可执行程序名字
list查看文件内容及函数
设置断点 b 行数
执行 r
单步执行 n
进入函数内部 s
查看变量的值 p
退出调试 quit
执行下一个断点 c
info b查看断点信息
disable b 1 使断点1失效
bt 显示堆栈
makefile
1、touch makefile/Makefile
2、编辑
1个规则
gcc -o main main.c
目标:依赖项
(tab制表符) 命令
3、make执行
4、执行./main
版本2:
gcc -o main.o -c ./source/main.c -I ./header
gcc -o mySort.o -c ./func/mySort.c -I ./header
gcc -o main main.o mySort.o
对应Makefile文件的内容
main:main.o mySort.o
gcc -o main main.o mySort.o
mySort.o:./func/mySort.c
gcc -o mySort.o -c ./func/mySort.c -I ./header
main.o:./source/main.c
gcc -o main.o -c ./source/main.c -I ./header
版本3:
自定义变量
2个函数
src = $(wildcard ./source/.c,./func/.c)
wildcard是一个函数,参数是./*.c 返回值赋值给obj
功能:查找当前路径下的所有的.c文件
patsubst
obj = (src))
src=$(wildcard ./source/*.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o main $(obj)
mySort.o:./source/mySort.c
gcc -o mySort.o -c ./source/mySort.c -I ./header -w
main.o:./source/main.c
gcc -o main.o -c ./source/main.c -I ./header -w
clean:
-rm -rf $(obj) //清除编译过程中出现的*.o
自动变量
^ 代表所有的依赖
$< 代表依赖项中的第一个
src=$(wildcard ./source/*.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o $@ $(obj)
mySort.o:./source/mySort.c
gcc -o mySort.o -c $< -I ./header -w
main.o:./source/main.c
gcc -o main.o -c $^ -I ./header -w
clean:
-rm -rf $(obj)
src=$(wildcard ./source/*.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o $@ $(obj)
%.o:./source/%.c
gcc -o $@ -c $< -I ./header -w
clean:
-rm -rf $(obj)
//注意变量的小括号 $()
src=$(wildcard *.c)
obj=$(patsubst %.c,%.o,$(src))
main:$(obj)
gcc -o $@ $(obj)
%.o:%.c
gcc -o $@ -c $<
clean:
rm main *.o
rebuild:clean main
//测试
make
make rebuild
make clean