最近因为工作关系需要接触makefile,感觉在dos窗口下输入一个make后就可以等着目标文件生成的感觉还是很舒服的,相比原来使用IDE开发,我觉得makefile让我对编译过程有了进一步的了解。
首先创建一个c源文件a.c
代码如下:
#include"stdio.h"
void main()
{
printf("hello makefile\n");
}
然后新建一个文本文档,名字改为makefile,然后去掉后缀名,然后编辑这个文件
makefile具体内容如下:
DIR = D:\MyDownloads\Download\VC6.0green\VC98\Include
LIB_DIR = D:\MyDownloads\Download\VC6.0green\VC98\Lib
Test:a.obj
Link a.obj $(LIB_DIR)/LIBC.LIB $(LIB_DIR)/OLDNAMES.LIB $(LIB_DIR)/KERNEL32.LIB
a.obj:a.c
cl a.c -I $(DIR) $(LIB_DIR)/LIBC.LIB $(LIB_DIR)/OLDNAMES.LIB $(LIB_DIR)/KERNEL32.LIB
clean:
@echo clean the following files:
rm a.exe
rm a.obj
@echo Done!
按代码顺序解释下:
1DIR是创建的一个变量,这个变量就是一个目录,这个目录是存放了c程序中stdio.h的路径
2LIB_DIR同DIR,这个路径是存放了编译中需要用到的静态库的路径,这三个静态库分别为LIBC.LIB OLDNAMES.LIB KERNEL32.LIB
4目标文件为Test,冒号后面为生成这个目标文件的依赖文件,也就是a.obj
5链接a.obj还有那三个静态库来生成目标文件
6中间文件a.obj,冒号后面同样是依赖文件
7编译源文件a.c还有三个静态库文件
8clean 便于重新编译链接
9@echo 后面的内容是显示在dos中的内容
10移除a.exe
11移除a.obj
12同9
makefile编写完成后的操作过程:
进入dos窗口,然后进入到含有makefile的目录下,输入make,运行完成后输入a.exe就可以看见打印信息。
然后输出make clean就可以清除a.exe和a.obj
在编写makefile中遇到的问题:
1对于源文件不在同一目录下的处理
解决方法:定义一个目录,然后在编译链接过程中的依赖目录中加入对应库文件,如果是在别的目录下的头文件,那么在依赖关系中前需要加入-I(i)。