一直都希望能够把make弄得清晰些,今天就从最简单的开始
例子1:(hello.c)
C语言:
1 #include
2 int main(int argc, char** argv)
3 {
4 printf("Hello, Linux World!\n");
5 return 0;
6 }
简单的都不用make了,编译命令是
还是弄个make文件试试吧
Makefile语言:
hello: hello.c
gcc -Wall hello.c -o hello
在当前目录下运行make,生成了hello运行文件
例子2:(hello.c hello.h)
现在来加个头文件hello.h,先把hello.c改成这个样子
(为了方便检验hello.h是否修改,我加了一个变量)
C语言:
1 #include "hello.h"
2 int main(int argc, char** argv)
3 {
4 printf("Hello, Linux World! \nnow:%d\n",a);
5 return 0;
6 }
建立一个hello.h,内容如下:
C语言:
1 #include
2 int a=100;
运行编译命令(运行make效果一样)
gcc -Wall hello.c -o hello
编译器会自动找到当前目录下的头文件(hello.h),运行命令
./hello
输出
Hello, Linux World!
now:100
现在修改hello.h中的a变量的值到200
运行命令
./hello
输出
Hello, Linux World!
now:100
看样子a变量值修改没有效果,再用make试验一下,提示
make: “hello”是最新的。
运行编译命令
gcc -Wall hello.c -o hello
./hello
输出
Hello, Linux World!
now:200
这次gcc和make调用gcc结果不同了,把make文件改一下(在第一行加hello.h,告诉gcc如果hello.h修改了重新编译)
Makefile语言:
1 hello: hello.c hello.h
2 gcc -Wall hello.c -o hello
现在把a=200改成300,结果make 和直接gcc效果一样了
例子3:(src/hello.c include/hello.h makefile)
现在来个带目录的例子,一般我们都是把源文件和头文件放到不同的目录里面,把各个文件按照下面的目录结构移动过去
mkdir src
mkdir include
mv hello.c ./src/
mv hello.h ./include/
结果变成这个样子
|---makefile
|---src
| |---hello.c
|---include
| |---hello.h
现在make会报告错误
make: *** 没有规则可以创建“hello”需要的目标“hello.c”。 停止。
把make文件修改成这样,利用VPATH变量来指定搜索目录(
参考这个帖子)
VPATH只是告诉了Make在哪里寻找文件, 而gcc并不知道在哪里寻找hello.h (即VPATH只和Makefile中的target, prerequisites相关, 而不和command相关). 所以gcc 要加-I include 参数
Makefile语言:
1 VPATH = src include
2 hello: hello.c hello.h
3 gcc -I include -Wall $< -o hello
利用vpath更加灵活
Makefile语言:
1 vpath %.h include
2 vpath %.c src
3 hello: hello.c hello.h
4 gcc -I include -Wall $< -o hello
也可以声明一个CFLAGS变量,把路径设置放在make文件的头部.
Makefile语言:
1 vpath %.h include
2 vpath %.c src
3 CFLAGS = -I include
4
5 hello: hello.c hello.h
6 gcc $(CFLAGS) -Wall $< -o hello
如果希望每次make都能自动运行hello,可以这样写make文件
Makefile语言:
01 vpath %.h include
02 vpath %.c src
03 CFLAGS = -I include
04 all: hello run
05 .PHONY: all
06
07 hello: hello.c hello.h
08 gcc $(CFLAGS) -Wall $< -o hello
09 run:
10 ./hello
阅读(1293) | 评论(1) | 转发(0) |