makefile文件由make命令执行。这个文件里面有一个工程的编译规则,先编译那个文件,编译顺序,在很多IDE下可以自己完成。这里只是简单介绍,详细内容:http://www.chinaunix.net/old_jh/23/408225.html
规则:目标:依赖
命令
链接外部库,就算在开始声明了math.h函数不会加载libmath.a库,只有在编译时加入
gcc -g -Wall hellomath.c -lm -o math -lm是-libm.a简写。
Make凭借本身的优势,可在所有的 Unix系统中被找到。要了解关于Gnu make的更多信息,请参考 Richard M. Stallman和 Roland McGrath编写的GNU Make手册。 Make 从makefile(默认是当前目录下的名为‘Makefile’的文件)中读取项目的描述。makefile指定了一系列目标(比如可执行文件)和依赖(比如对象文件和源文件)的编译规则,其格式如下:
目标:依赖
命令
对每一个目标,make检查其对应的依赖文件修改时间来确定该目标是否需要利用对应的命令重新建立。注意到,makefile中命令行必须以单个的TAB字符进行缩进,不能是空格。
GNU Make 包含许多默认的规则(参考隐含规则)来简化makefile的构建。比如说,它们指定‘.o’文件可以通过编译‘.c’文件得到,可执行文件可以通过将‘.o’链接到一起获得。隐含规则通过被叫做make变量的东西所指定,比如CC(C语言编译器)和CFLAGS(C程序的编译选项);在makefile文件中它们通过独占一行的变量=值的形式被设置。对C++,其等价的变量是CXX和CXXFLAGS,而变量CPPFLAGS则是编译预处理选项。
现在我们为上一节的项目写一个简单的 makefile 文件:
CC=gcc
CFLAGS=-Wall
hello: hello.ohello_fn.o
clean:
rm -f hello hello.o hello_fn.o
该文件可以这样来读:使用 C 语言编译器gcc,和编译选项‘-Wall’,从对象文件‘hello.o’和‘hello_fn.o’生成目标可执行文件hello(文件‘hello.o’和‘hello_fn.o’通过隐含规则分别由‘hello.c’和‘hello_fn.c’生成)。目标clean没有依赖文件,它只是简单地移除所有编译生成的文件。rm命令的选项 ‘-f’(force) 抑制文件不存在时产生的错误消息。
另外,需要注意的是,如果包含main函数的cpp文件为A.cpp, makefile中最好把可执行文件名也写成 A。
要使用该 makefile 文件,输入make。不加参数调用make时,makefile文件中的第一个目标被建立,从而生成可执行文件‘hello’:
$ make
gcc -Wall -c -o hello.o hello.c
gcc -Wall -c -o hello_fn.o hello_fn.c
gcc hello.o hello_fn.o -o hello
$ ./hello
Hello, world!
一个源文件被修改要重新生成可执行文件,简单地再次输入make即可。通过检查目标文件和依赖文件的时间戳,程序 make可识别哪些文件已经修改并依据对应的规则更新其对应的目标文件:
$ vim hello.c (打开编辑器修改一下文件)
$ make
gcc -Wall -c -o hello.o hello.c
gcc hello.o hello_fn.o -o hello
$ ./hello
Hello, world!最后,我们移除 make 生成的文件,输入 make clean:
$ make clean
rm -f hello hello.o hello_fn.o一个专业的 makefile文件通常包含用于安装(make install)和测试(makecheck)等额外的目标。
本文中涉及到的例子都足够简单以至于可以完全不需要makefile,但是对任何大些的程序都使用 make 是很有必要的。