makefile 其实功能挺强大的,这里只是简单谈谈编译C文件的方法。
简单点说,makefile 描述的是目标文件,依赖文件与文件操作命令三部分内容,
目标文件:依赖文件
(一个TAB键)命令语句
一个简单的例子:
main.c
#include<stdio.h>
#include<string.h>
#include "save.h"
int main()
{
int n=0;
while(~scanf("%d",&n))
{
int len = strlen(str[n]);
if(len > 0)
printf("%s\n",fun(n));
else printf("ERROR!\n");
}
return 0;
}
save.h
#define N 100
char str[][N]={
"I love you!",
"What a fucking day!",
"So What!!!",
"When and where shall we meet?"
"Good moening!",
"Have a good time!",
"See you."
};
char * fun(int i){
return str[i];
}
makefile
NODE 1:
在终端输入:
make
的时候,确省参数即为 main (即 makefile 中的第一个目标文件,就是说相当与输入了:make main);
如果想要执行 clean 操作,需要给 make 命令参数,在终端输入:
make clean
NODE 2:
依赖文件如果和目标文件不在同一个目录,需要加地址,比如:
gcc -c main.c -I /home/administrator/ $^
# $@ -- 目标文件,$^ -- 所有依赖文件
# main 即为可执行文件
# *.c (用 -c 生成,-c是只编译,不链接,默认GCC/G++是编译链接) *.o(目标文件(二进制)) ,-o 命令可以给可执行文件命名
main: main.o
gcc -o $@ $^ ### gcc -o main main.o
main.o: main.c save.h
gcc -c main.c save.h
clean:
rm main.o main
这里多说一点,如果你嫌每次都敲个 makefile 麻烦的话,可以考虑下用字符替换,把原有的 makefile 中的关键字,也就是文件名替换成新的,即将要编译的文件名(当然不是所有情况下都能这么做),比如,现在我们新建了一个文件 Rank.c ,需要编译,然后,它的编译条件和 main.c 的一样,那么调用 sed 命令,把 main 替换成 Rank 就行了:
sed -i 's/main/Rank/g' makefile
sed命令具体讲解可以去搜下,很多,这里就不说了