《跟我一起写 Makefile(陈皓)》参考资料: https://blog.csdn.net/Sudley/article/details/93919227
test1
test1测试代码包下载地址
https://download.csdn.net/download/sudley/11264717
要求编写Makefile文件进行编译,输出test可执行文件。test文件由目录下main.c文件、func.h文件和test*.c…文件组成。要求在源码目录下执行make成功可执行文件test,执行test输出对应内容,执行make clean删除所有make生成的文件。
main.c
#include <stdio.h>
#include "func.h"
int main(void)
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
printf("Good job!\n");
return 0;
}
func.h
#ifndef FUNC_H
#define FUNC_H
void test1(void);
void test2(void);
void test3(void);
void test4(void);
void test5(void);
void test6(void);
void test7(void);
#endif
test1.c
其他test文件内容相似
#include <stdio.h>
void test1(void)
{
printf("I ");
}
运行结果展示
Makefile参考
这种写法test1.c修改的话只需要重新编译test1.o和main.o,其他test*.o文件不需要重新编译
obj = main.o test1.o test2.o test3.o test4.o test5.o test6.o test7.o
test : $(obj)
cc -o test $(obj)
main.o : main.c func.h
clean:
rm -rf *.o test
-M参数自动生成依赖
obj = main.o test1.c test2.c test3.c test4.c test5.c test6.c test7.c
test : $(obj)
cc -M main.c
cc -o test $(obj)
clean:
rm -rf *.o test
不会生成.o文件的版本,这种写法的话只要任意一个test修改了都需要全量编译
obj = main.c test1.c test2.c test3.c test4.c test5.c test6.c test7.c
test : $(obj)
cc -o test $(obj)
clean:
@rm -rf *.o test
test2
test2测试代码包下载地址
https://download.csdn.net/download/sudley/11264868
test1只是让大家简单了解一下Makefile的工作原理,实际编译工程往往要复杂的多,所以我们在test1的基础上进行level up。将源码和头文件放到不同的目录下,头文件放到include目录,c代码放在src目录且包含子目录。
要求编写Makefile,编写后目录如下
当执行make时生成build目录,目录结构类似src目录并生成对应c文件的.o文件和test可执行文件
执行make install则将test文件拷贝到当前目录
执行make clean删除所有编译文件,返回到执行make之前的状态
变量定义建议使用:=而不是直接用=,用=能够使用后面定义的变量,而:=定义的变量右边的值只能是之前定义的
参考Makefile:
以下是我写的两个重要Makefile文件,若发现错误或者有更好的方法欢迎在评论区留言,Thanks♪(・ω・)ノ
export Top:=${shell pwd}
export Src:=$(Top)/src/
export Include:=$(Top)/include/
export Build:=$(Top)/build/
all:
@$(MAKE) -C $(Src)
install:
@cp $(Build)/test $(Top)
clean:
@-rm -rf $(Build) $(Top)/test
all:main.o test4.o
@mkdir -p $(Build)
@mv *.o $(Build)
$(MAKE) -C $(Src)/dir1
$(MAKE) -C $(Src)/dir2
$(CC) -o $(Build)/test $(Build)/*.o $(Build)/dir1/*.o $(Build)/dir2/*.o
main.o : $(Include)/func.h
$(CC) -c main.c -I$(Include)