赞
踩
b:a
@echo "hello b"
a:
@echo "hello world"
b依赖于a,make先执行a,再执行b。"@"为抑制输出。
编译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、系统变量: $*:不包括扩展名的目标文件名称, $%:如果目标是归档成员,则改变量表示归档成员的名称,不包括扩展名 $^:不重复依赖文件 $@:目标文件的完整名称 %+扩展名:可替代$* $%。 //注释:该变量不可以用在最终生成目标声明身上,因为该目标一般具有一个以上的依赖文件,例如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、静态连接库需要的依赖文件是.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。
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系统中有相应的搜索优先级:你需要先将动态库文件位置作出相应的改变
SRCS = $(shell ls *.c) #将shell命令运行的结果赋值给SRCS
OBJS = $(SRCS:.c = .o) #字符串处理,将SRCS变量中的.c变成.o
隐含规则:make可以自动推导一些常用的编译规则
%.o: %.c # 遇到一个.o文件且没有给出规则,就看看是否有相应的编译规则,如
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ %^
通过 .PHONY 关键字声明一个伪目标,伪目标不对应任何实际的文件(目录下有同名的文件也不会影响执行),不管伪目标的依赖是否更新,命令总是执行
.PHONY : clean
clean :
rm *.o hello.out
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。