变量与函数的综合示例(九)

之前我们学习了 makefile 中的变量及函数的相关语法知识,那么我们今天就来以实际需求为例来进行实际编写。实战需求:1、自动生成 target 文件夹存放可执行文件;2、自动生成 objs 文件夹存放编译生成的目标文件(*.o);3、支持调试版本的编译选项;4、考虑代码的扩展性。

那么在进行今天的 makefile 编写之前,我们还需要了解下几个知识点:a> $(wildcard _pattern),它的作用是获取当前工作目录中满足 _pattern 的文件或目录列表;b> $(addprefix _prefix,_names),它的作用是给名字列表 _names 中的每一个名字增加前缀 _prefix。

其中的关键技巧:1、自动获取当前目录下的源文件列表(函数调用):SRCS := $(wildcard *.c);2、根据源文件列表生成目标文件列表(变量的值替换):OBJS := $(SRCS:.c=.o);3、对每一个目标列表加上路径前缀(函数调用):OBJS := $(addprefix path/, $(OBJS))。

我们来看看规则中的模式替换(目录结构),如下

看看编译规则的依赖,如下

下来我们来看看具体的 makefile 是怎样编写的,还是以之前的那三个 .c 文件为源文件。

CC := gcc
MKDIR := mkdir
RM := rm -rf

DIR_OBJS := objs
DIR_TARGET := target

DIRS := $(DIR_OBJS) $(DIR_TARGET)

TARGET := $(DIR_TARGET)/hello-makefile.out

# main.c func.c const.c
SRCS := $(wildcard *.c)

# main.o func.o const.o
OBJS := $(SRCS:.c=.o)

# objs/main.o objs/func.o objs/const.o
OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))

.PHONY : rebuild clean all

$(TARGET) : $(DIRS) $(OBJS)
    $(CC) -o [email protected] $(OBJS)
    @echo "Target File ==> [email protected]"

$(DIRS) :
    $(MKDIR) [email protected]

$(DIR_OBJS)/%.o : %.c
    ifeq ($(DEBUG),true)
        $(CC) -o [email protected] -g -c $^
    else
        $(CC) -o [email protected] -c $^
    endif

rebuild : clean all

all : $(TARGET)

clean :
    $(RM) $(DIRS)

我们来看看编译效果

我们看到已经正确执行了,在当前目录下自动生成两个文件夹 objs  target。在 objs 文件夹里生成三个 .o 文件,在 target 文件夹中生成 hello-makefile.out 文件,执行这个可执行文件,结果也是我们之前定义的。下来我们来看看能不能定义 DEBUG 版的程序,这时便要用到一个命令了 objdump -S target,它用于来查看程序是否为调试版。下来我们来看看结果,图 a 为普通版的,图 b 为 DEBUG 版的

图 a 普通版

图 b DEBUG 版

我们看到 DEBUG 版本相对于普通版来说,多了一些东西,比如我们在里面写的 printf 语句,而且多了函数调用的语句。普通版则是只执行程序就 OK 了。通过今天的综合示例的编写,总结如下:1、目录是可以成为目标的依赖的,在规则中创建目录;2、预定义函数是 makefile实战时不可或缺的部分;3、规则中的模式匹配可以直接针对目录中的文件;4、可以使用命令行变量编译特殊的目标版本。

欢迎大家一起来学习 makefile 语言,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2130122

时间: 2024-10-02 23:39:45

变量与函数的综合示例(九)的相关文章

第10课 - 变量与函数的综合示例

第10课 - 变量与函数的综合示例 1. 实战需求 (1)自动生成 target 文件夹存放可执行文件 (2)自动生成 objs 文件夹存放编译生成的目标文件(*.o) (3)支持调试版本的编译选项 (4)考虑代码的扩展性  --> 使用变量 2. 工具原料 - $(wildcard _pattern) 获取当前工作目录中满足_pattern的文件或目录列表 - $(addprefix _prefix, _names) 给名字列表_names中的每一个名字增加前缀_prefix 3. 关键技巧

make--变量与函数的综合示例 自动生成依赖关系

一.变量与函数的示例 示例的要求1.自动生成target文件夹存放可执行文件2.自动生成objs文件夹存放编译生成的目标文件3.支持调试版本的编译选项4.考虑代码的扩展性完成该示例所需的1.$(wildcardpattern)获取当前工作目录中满足pattern的文件或目录列表2.$(addprefix,_name)给名字列表name的每一个名字增加前缀_prefix关键技巧1.自动获取当前目录下的源文件列表(函数调用) SRC : = $(wildcard *.c) 2.根据源文件列表生成目标

JavaScript 中对变量和函数声明的提前示例

如题所示,看下面的示例(可以使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发者工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter可以中途代码换行) var name = "xiaoming"; (function(){ var name = name || "小张"; console.info(name); })();// 小张 (function(){ name = name || "小张";

C结构体工具DirectStruct(综合示例二)

1.编写定义文件,用工具dsc处理之,自动生成XML转换代码和ESQL代码片段 2.编写应用代码 3.编译运行 ------------------------------------------------------------ DirectStruct是一个强有力的代码自动生成工具,它可以自动生成C结构体与XML.JSON.二进制(带压缩)等报文之间的转换代码,还能自动生成ESQL代码片段,在应用中直接使用自动化代码以提高开发效率,避免开发冗余和手工编码风险. 综合示例二演示了应用从数据库

存储过程和存储函数和触发器示例

1.存储过程示例:为指定的职工在原工资的基础上长10%的工资 SQL> create or replace procedure raiseSalary(empid in number) as pSal emp.sal%type; begin select sal into pSal from emp where empno=empid; update emp set sal = sal*1.1 where empno=empid; dbms_output.put_line('员工号:' || e

Spring MVC 学习总结(四)——视图与综合示例

一.表单标签库 1.1.简介 从Spring2.0起就提供了一组全面的自动数据绑定标签来处理表单元素.生成的标签兼容HTML 4.01与XHTML 1.0.表单标签库中包含了可以用在JSP页面中渲染HTML元素的标签.表单标记库包含在spring-webmvc.jar中,库的描述符称为spring-form.tld,为了使用这些标签必须在jsp页面开头处声明这个tablib指令. <%@ taglib prefix="form" uri="http://www.spri

Join函数 及Split函数精解示例

'************************************************************************* '**模 块 名:Join函数 及Split函数精解示例 '**说    明:蓝凤凰设计商城 浴火凤凰-郭卫 | 蓝凤凰-魔灵 | 郭卫-icecept '**创 建 人:浴火凤凰-郭卫 '**日    期:2015年10月11日  17:49:52 '**修 改 人:浴火凤凰-郭卫 '**日    期: '**描    述:QQ:49340599

第19课 - 路径搜索的综合示例

第19课 - 路径搜索的综合示例 1. 需求分析 (1)工程项目中不希望源码文件夹在编译时被改动(只读文件夹) (2)在编译时自动创建文件夹(build)用于存放编译结果 (3)编译过程中能够自动搜索需要的文件 (4)makefile 易于扩展,能够复用于相同类型的项目 (5)支持调试版本的编译选项 2. 项目类型分析 3. 工具原料 4. 关键技巧 5. 编译规则的依赖 值得斟酌的问题? 对于规模较小的项目,makefile 中是否也需要使用自动生成依赖关系的解决方案呢? 模式规则的灵活运用使

死磕JavaScript变量和函数的预解析

预解析:在解析代码之前做一些处理 预解析做什么处理? 把变量的声明提前了----提前到当前所在的作用域的最上面 函数的声明也会被提前---提前到当前所在的作用域的最上面 那么我们现在开始举几个例子 1.观察下方的第一个红框中的代码,猜猜它的结果是什么? 通过运行我们发现,代码竟然神奇的没有报错?但是输出的也不是下面赋值的1而是undefined,这到底是为什么呢?其实这就是因为js引擎的预解析将num这个变量的声明提前到作用域的最上方(num是全局变量所以提前到最外层也就是script标签内的最