教你怎么使用Makefile编译工程代码
来源:互联网 发布:电信流量查询软件 编辑:程序博客网 时间:2024/04/29 15:19
【原文:http://www.myexception.cn/software-architecture-design/972311.html】
教你如何使用Makefile编译工程代码一、前言概述
《跟我一起学Makefile》是一篇全面学习编写Makefile基本规则的很好的文章,初学者应该好好理解里面的知识要点。但是很多人学完之后,并不能站在一个系统的高度通过Makefile来组织整个工程的编译。麻雀虽小,五脏俱全 —— 此篇的目的就是想通过简单的实例,来说明如何使用Makefile组织大型工程项目。
二、工程框架
图1 工程框架
假设现有一个如图1所示的工程:其各自代码如下:
// add.h#if !defined(__ADD_H__)#define __ADD_H__#if defined(__ADD__)extern int add(int a, int b);#endif /*__ADD__*/#endif /*__ADD_H__*/
// add.c#include<stdio.h><stdio h="">#include<stdlib.h><stdlib h="">#if defined(__ADD__)int add(int a, int b){ return a+b;}#endif /*__ADD__*/</stdlib></stdio>
// sub.h#if !defined(__SUB_H__)#define __SUB_H__#if defined(__SUB__)extern int sub(int a, int b);#endif /*__SUB__*/#endif /*__SUB_H__*/
// sub.c#include<stdio.h><stdio h="">#include<stdlib.h><stdlib h=""></stdlib></stdio>#if defined(__SUB__)int sub(int a, int b){ return a-b;}#endif /*__SUB__*/
// test.c#include <stdio h="">#include <stdlib h="">#if defined(__ADD__)#include "add.h"#endif /*__ADD__*/#if defined(__SUB__)#include "sub.h"#endif /*__SUB__*/int main(int argc, const char *argv[]){ int a = 10, b = 20;#if defined(__ADD__) printf("%d+%d = %d\n", a, b, add(a, b));#endif /*__ADD__*/#if defined(__SUB__) printf("%d-%d = %d\n", a, b, sub(a, b));#endif /*__SUB__*/ return 0;}</stdlib></stdio>
三、编写Makefile
在project目录下新建make目录,所有makefile文件都放在此目录下。则Makefile文件包含:
①、宏开关模块
宏开关模块:是通过一个开关(switch)来控制某个宏的开启和关闭,以此达到控制软件平台某个功能的开启和关闭。
// switch.makCFG_ADD_SUPPORT = TRUE # FALSE # 加法开关CFG_SUB_SUPPORT = FALSE # TRUE # 减法开关
②、宏加载模块
宏加载模块:根据宏开关模块的设置,将宏加入编译选项
// option.makifeq(TRUE, $(strip $(CFG_ADD_SUPPORT))) OPTIONS += __ADD__endififeq(TRUE, $(strip $(CFG_SUB_SUPPORT))) OPTIONS += __SUB__endif③、路径设置模块
// paths.mak# 设置头文件路径(相对路径)INCLUDED := -I../add \ -I../sub# 设置源文件路径ADD_PATH = ../add # 加法源文件路径(相对路径)SUB_PATH = ../sub # 减法源文件路径(相对路径)SRC_PATH = ../src # 测试源文件路径(相对路径)# 加载源文件SRC_LIST := $(SRC_PATH)/test.c # 加载测试源文件#ifeq(TRUE, $(strip $(CFG_ADD_SUPPORT)))SRC_LIST += $(ADD_PATH)/add.c # 加载加法源文件#endif /*CFG_ADD_SUPPORT*/#ifeq(TRUE, $(strip $(CFG_SUB_SUPPORT)))SRC_LIST += $(SUB_PATH)/sub.c # 加载减法源文件#endif /*CFG_SUB_SUPPORT*/
④、编译模块
// Makefile# 引入makefile文件include switch.makinclude options.makinclude paths.makCC := gccCFLAGS := -O2 $(INCLUDED)CFLAGS += $(patsubst %, -D%, $(OPTIONS)) # patsubst起拼接作用OBJS := $(subst .c, .o, $(SRC_LIST)) # subst起替换作用TARGET := $(SRC_PATH)/test.elf.PHONY: all clean clean_allall: $(TARGET)$(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $(TARGET) $(OBJS)$(OBJS): %.o: %.c $(CC) $(CFLAGS) -c $< -o $@clean: rm -fr $(OBJS)
⑤、编译和执行
#cd project/make#make#cd ../test
⑥、运行结果
1. 如果CFG_ADD_SUPPORT = TRUE ,并且CFG_SUB_SUPPORT = FALSE,则运行结果为:
10+20 = 30
2. 如果CFG_ADD_SUPPORT = TRUE ,并且CFG_SUB_SUPPORT = TURE,则运行结果为:
10+20 = 30
10-20 = -10
3. 如果CFG_ADD_SUPPORT = FALSE ,并且CFG_SUB_SUPPORT = TRUE,则运行结果为:
10-20 = -10
四、最终框架
图2 最终框架
- 教你怎么使用Makefile编译工程代码
- 教你如何使用Makefile编译工程代码
- 使用autoconf生成Makefile并编译工程
- VC使用技巧:让你团队里所有人在编译工程时都要看你的代码注释
- Makefile工程编译
- Linux工程下所有C代码编译Makefile模板
- Linux环境中使用CodeBlocks编译Makefile工程
- 怎么编译qutlook工程
- 使用makefile管理工程
- 使用Makefile构建工程
- 使用Makefile工程管理
- linux下编译工程(使用命令行、Makefile、cmake编译helloworld)
- 教你怎么使用apilication
- 使用Makefile编译Erlang
- vc的MakeFile工程直接编译驱动
- vc的MakeFile工程直接编译驱动
- Emacs下工程的编译:makefile
- Emacs下工程的编译:makefile
- pgsql 排序
- shell编程awk
- 我原来的百度博客,用了七、八年了
- CodeIgniter的源码解读
- 判断字符串的编码格式
- 教你怎么使用Makefile编译工程代码
- flv文件AVCDecoderConfigurationRecord以及AudioSpecificConfig结构
- pgsql limit及offset
- AWK学习总结(五)条件语句
- The Building Blocks-Enterprise Applications Part 1- Overview and ERP
- JQuery
- 提高设计频率之基本功:流水线设计(pipeline Design)
- win7下 sql server 2000安装总是报错
- 06-android入门_listview采用系统和自定义的方式实现item