当前位置:   article > 正文

Makefile 学习笔记_makefile里面增加删除.o文件操作

makefile里面增加删除.o文件操作

Makefile 学习笔记

1、hello world

b:a
	@echo "hello b"

a:
	@echo "hello world"
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

4、编译静态链接库

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

libmain.a:$(depend)
	ar rsc libmain.a $^
$*.o:$%.c
	gcc -c $^ -o $@
  • 1
  • 2
  • 3
  • 4

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

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

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 $@
  • 1
  • 2
  • 3
  • 4
  • 5

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

run:
	gcc main.cpp -o main -L ./ -lmain
  • 1
  • 2

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

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

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

6 、Makefile 一些语法

SRCS = $(shell ls *.c)  		#将shell命令运行的结果赋值给SRCS
OBJS = $(SRCS:.c = .o)		#字符串处理,将SRCS变量中的.c变成.o
  • 1
  • 2

隐含规则:make可以自动推导一些常用的编译规则

%.o: %.c		# 遇到一个.o文件且没有给出规则,就看看是否有相应的编译规则,如
	$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ %^
  • 1
  • 2

通过 .PHONY 关键字声明一个伪目标,伪目标不对应任何实际的文件(目录下有同名的文件也不会影响执行),不管伪目标的依赖是否更新,命令总是执行

.PHONY : clean
clean :
    rm *.o hello.out
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/965530
推荐阅读
相关标签
  

闽ICP备14008679号