Makefile 学习笔记

2023-05-16

Makefile 学习笔记

1、hello world

b:a
	@echo "hello b"

a:
	@echo "hello world"

b依赖于a,make先执行a,再执行b。"@"为抑制输出。

2、编译gcc

编译gcc最好用到 **.o中间文件,该方式可以节省大量除第一次编译以外的大量时间,也即:这种方式在第二次编译的时候,只编译你所改动的文件:你若改变add.c文件,make后只编译add.o与main这两代码块。

#第一次编译俩小时
#第二次编译5分钟
#保证只编译你改动的文件
main: main.o add.o sub.o
	gcc main.o add.o sub.o -o main
main.o:main.c
	gcc -c main.c -o main.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
clean:
	rm -f *.o main

3、Makefile变量

1、系统变量: $*:不包括扩展名的目标文件名称,
			$%:如果目标是归档成员,则改变量表示归档成员的名称,不包括扩展名
			$^:不重复依赖文件
			$@:目标文件的完整名称
			%+扩展名:可替代$* $%//注释:该变量不可以用在最终生成目标声明身上,因为该目标一般具有一个以上的依赖文件,例如main,但可以用在它的内容上。 
例子:将依赖文件以$^代替,将目标文件以$@代替,以$*取代声明中的目标文件名,后面补上扩展名,$%取代声明中的依赖文件。
main: main.o add.o sub.o
	gcc $^ -o $@
$*.o:$%.c
	gcc -c $^ -o $@
2、系统常量:AS:汇编程序名称,默认as;CC:C编译器名称,默认cc;CXX,C++编译器名称,默认g++;RM 文件删除程序别名,默认 rm -rf
3、自定义变量:
	定义:变量名=变量值
	使用:$(变量名)/${变量名}
例子:
depend=main.o add.o sub.o
main:$(depend)
	gcc $(depend) -o main

4、编译静态链接库

1、静态连接库需要的依赖文件是.o文件,生成的文件是lib+'文件名‘+.a,也即libxxx.a,lib与.a分别为其头与尾,编译方式为:

libmain.a:$(depend)
	ar rsc libmain.a $^
$*.o:$%.c
	gcc -c $^ -o $@

这样就通过make生成了静态库文件libmain.a,
2、静态库文件使用方法:

run:
	gcc main.c -o main -L ./ -l main
	#注释:-L表示连接文件搜索路径,-l表示指定的链接静态文件,且该文件需要掐头去尾,也即去掉lib以及.a,只剩main。

5、编译动态库

1、动态连接库需要的依赖文件是.o文件,生成的文件是lib+'文件名‘+.os,也即libxxx.os,lib与.os分别为其头与尾,编译方式为:

depend = add.o sub.o
libmain.os:$(depend)
	gcc -shared $^ -o $@
$*.o:$%.cpp
	gcc -fPIC $^ -o $@

参数 -fPIC/-fpic 代表地址无关,在由c/c++代码生成.o文件时候使用。参数-shared代表共享文件,由.o生成动态链接库.os时候使用。
2、动态链接库使用:

run:
	gcc main.cpp -o main -L ./ -lmain

该代码与4.2节相同。但是动态链接库与静态不一样,此时生成的main文件还不可执行,若是执行会报错:

./main: error while loading shared libraries: libmain.so: cannot open shared object file: No such file or directory

因为动态链接库的代码并不包含在可执行文件main中,所以执行时候需要搜索动态链接库地址,在linux系统中有相应的搜索优先级:你需要先将动态库文件位置作出相应的改变
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Makefile 学习笔记 的相关文章

随机推荐