目的:
鉴于android代码的makefile;头文件与不同c文件均在不同路径,通过makefile,编译代码并输出到指定目录。
参考资料:《How to Write makefile》陈皓
头文件目录:
Desktop/temp/inc
sum.h
sum2.h
源码目录:
Desktop/temp/src
2.c (main函数)
printf.c
头文件1:sum.h
#include "sum2.h" #define bool int enum BoolType { false = 0, true, }; void Myprintf();
头文件2:sum2.h
#include "stdio.h"
c文件1:2.c
#include "sum.h" int main() { Myprintf(); return 0; }
c文件2:printf.c
#include "sum.h" void Myprintf() { printf("printf.c\n"); }
理解版mk:test.mk
#定义变量与索引路径 local_path=/home/liaoyuhuan/Desktop/temp CC=gcc #头文件路径 inc_dir=$(local_path)/inc #代码路径 src_dir=$(local_path)/src #所有头文件路径 all_inc_dir=-I$(inc_dir) #头文件 不知道依赖文件不能为变量定义的路径 inc_file1=./inc/sum.h #代码文件 compile_file1=$(src_dir)/2.c compile_file2=$(src_dir)/printf.c #代码链接文件 link_file1=$(src_dir)/2.o link_file2=$(src_dir)/printf.o #编译输出路径 out_file=$(src_dir)/run #定义操作流程 #all:compile link #依赖 链接 编译 compile:$(inc_file1) $(CC) $(all_inc_dir) -c -o $(link_file1) $(compile_file1) $(CC) $(all_inc_dir) -c -o $(link_file2) $(compile_file2) link: $(CC) -o $(out_file) $(link_file1) $(link_file2) #清空 #func:清理产生的文件 .PHONY:clear clear: @echo "clear......" -rm $(out_file) $(link_file1) $(link_file2)
精简优化版:test2.mk
#定义变量与索引路径 name1是尝试获取当前makefile路径local_path name1=$(abspath $(firstword $(subst $(MAKEFILES),,$(MAKEFILE_LIST)))) #简化 #name1=$(abspath $(firstword $(MAKEFILE_LIST))) local_path=/home/liaoyuhuan/Desktop/temp CC=gcc #头文件路径 inc_dir=$(local_path)/inc #代码路径 src_dir=$(local_path)/src #所有头文件路径 all_inc_dir=-I$(inc_dir) -I$(src_dir) #代码链接文件 link_file1=$(src_dir)/2.o link_file2=$(src_dir)/printf.o link_files=$(src_dir)/2.o $(src_dir)/printf.o #编译输出路径 out_file=$(src_dir)/run #编译与链接 name1只是实验取得的当前路径,无关紧要 #all:$(link_file1) $(link_file2) link all:$(link_files) link @echo name1 = $(name1) $(link_files):%.o:%.c $(CC) $(all_inc_dir) -c $< -o $@ link: $(CC) -o $(out_file) $(link_file1) $(link_file2) #清空 #func:清理产生的文件 .PHONY:clear clear: @echo "clear......" -rm $(out_file) $(link_file1) $(link_file2)