现在的位置: 首页 > 综合 > 正文

学习makefile——编译多文件

2018年06月06日 ⁄ 综合 ⁄ 共 1801字 ⁄ 字号 评论关闭

目的:
鉴于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)

抱歉!评论已关闭.