Make工程管理器
定义:“自动编译管理器”,这里的’自动’是值它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。
编写makefile时创建和使用变量,其定义变量的两种方式:
递归展开方式VAR=VM
简单方式VAR:=VM
递归方式可以有下面的用法:
OBJ=VAR
VAR=VM
VM=main.c
这里还有一些创建和使用变量的方式,有兴趣可以到网上查下。
除此之外还有一些,系统预定义的变量:
CC-------------------表示gcc,c编译器的名称
CPP----------------------c预编译器的名称
CXX----------------------C++编译器的名称,默认为g++
等等还有一些....
一般是用简单方式来创建和使用变量。
简单的编写makefile(几种makefile的编写)
若当前有三个文件,分别为main.c increment.c negate.c
Mian中会用到后面两个文件
法一:
目标体:依赖体
执行体
1 main:main.o increment.o negate.o
2 gcc -Wall -g main.o increment.o negate.o -o main
3 main.o:main.c
4 gcc -Wall -g -c main.c -o main.o
5 increment.o:increment.c
6 gcc -Wall -g -c increment.c -o increment.o
7 negate.o:negate.c
8 gcc -Wall -g -c negate.c -o negate.o
9 clean:
10 rm -rf negate.o increment.o main.o main
~
法二:
技巧一:给在执行体中会常常用到的多个参数,用一个伪目标来代替该多个参数
技巧二:$@:表示目标体
$^:表示当前的所有依赖体成员
$<:表示当前依赖成员的第一个成员
1 #.PHONY:clean
2 CC := gcc
3 BY := -c
4 OBJECT := main.o increment.o negate.o
5
6 main:$(OBJECT)
7 $(CC) -Wall -g $(OBJECT) -o $@
8 main.o:main.c
9 $(CC) $(BY) $< -o $@
10 increment.o:increment.c
11 $(CC) $(BY) $< -o $@
12 negate.o:negate.c
13 $(CC) $(BY) $< -o $@
14
15 clean:
16 rm -rf main $(OBJECT)
法三:
技巧一:给在执行体中会常常用到的多个参数,用一个伪目标来代替该多个参数
技巧二:$@:表示目标体
$^:表示当前的所有依赖体成员
$<:表示当前依赖成员的第一个成员
技巧三:用%.o:%.c将当前文件夹中的所有.c文件转换为.o文件,很节约代码行,推介用
1 CC :=gcc
2 BY :=-Wall -g -c
3 OBJECT :=main.o increment.o negate.o
4
5 main:$(OBJECT)
6 $(CC) -Wall -g $^ -o $@
7 %.o:%.c
8 $(CC) $(BY) $< -o $@
9 clean:
10 echo "to makefile.3....."
11 rm -rf main $(OBJECT)
12
法四:
二、直接用才gcc来编译生成可执行文件
Gcc main.c increment.c negate.c -o main
条件:
在主函数只中需要用声明要用到的外部函数原型,本工程在主函数中需要声明的为:
extern int increment(int );
extern int negate(int);
三、通过生成库文件来管理工程
静态库:
首先:要将在主函数中用到的函数编译生成二进制文件
gcc -Wall -c increment.c -o increment.o
gcc -Wall -c negate.c -o negate.o
然后:将其生成静态库*.a文件,如下:
ar rcs libfunction.a increment.o negate.o
然后通过通过该库和主函数链接,然后编译生成可执行文件。
条件:需要在主函数中添加需要用到的函数的额文件用:
#incldue”increment.c”
#incldue”negate.c”
gcc -Wall libfunction.a main.c -o main
动态库: