gcc&第三方库&makefile

GCC编译

多文件编译

1、将所有的.c文件生成.o文件


image.png

2、生成可执行文件


image.png

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 = (patsubst %.o,%.c,(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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容