第五课 Makefile文件的制作(补充)

序言:

  前面的几节课讲解Makefile的一些基本知识也做了一些小例子实践了几下,那么到现在普通的练习则是没有问题。但是如果做项目文件较多又分层次等等还是会碰上好多问题的,这节课补充一些知识。

知识点:

  1.makefile的内嵌函数;

  2.二级目录的编写;

  3.多级目录的编写;

原理:

  GNU make还提供了相关的函数来帮助我们编写此文件,使得我们在编写makefile文件时更加灵活健壮。提供的函数大致分为有:处理文件名、文本内容、变量、命令四种;在这节中不会讲太多的函数甚至连最基本的去空格、排序、过滤功能函数也不会,只需要几个就可以了。有了这些函数就能帮我们很好的处理具有二级多级目录文件的编译工作。

  make函数接下来讲解几个常用的函数。

实践:

  1.内嵌函数

  1.1 函数的调用格式类似于变量的引用用$开始,具体如下:

$(FUNCTION ARGUMENTS)
#也可以是如下:
${FUNCTION ARGUMENTS}

  这里需要注意下:FUNCTION则是make内嵌的函数名称,如果是用户自己的需要用call间接调用;ARGUMENTS则是函数的参数多个使用都好分隔,所以参数中不能有都好分隔否则出错。

  1.2 常见的几个

    1.2.1 $(wildcard PATTERN):列出当前目录下匹配的文件、文件夹;例如列出当前目录下的所有目标.o文件:src=$(wildcard *.o)。

    1.2.2 $(patsubst PATTERN,REPLACEMENT,TEXT):在TEXT文本中符合PATTERN模式的讲替换成REPLACEMENT,例如把推导出calc.o,calcmain.o其calc.c和calcmain.c:

OBJECTS=calc.o calcmain.o
$(patsubst %.o,%.c,$(OBJECTS))  #(OBJECTS:.o=.c)也可以用

     1.2.3 $(shell 命令):执行shell命令,例如执行列出当前目录的所有文件夹:

$(shell ls -d */)

    1.2.4 $(findstring FIND,IN):在IN字符串里面查找FIND字符,如果存在则返回FIND,否则返回为空;

$(findstring a,abcd) #存在返回a

  2. Makefile文件支持二级目录

    2.1 先建立环境,看如下代码:

mkdir gcc04
cd gcc04
mkdir ui   #界面代码库
mkdir dal    #数据访问库
mkdir bll    #业务逻辑库

cd ui
touch ui.c ui.h

cd ../dal
touch dal.c dal.h

cd ../bll
touch bll.c bll.h

  在对ui、dal、bll模块下编写一些简单的测试代码:

#ui.c文件
#include <stdio.h>
#include "ui.h"

void print_UI(const char* str)
{
      printf(str);
}

#ui.h文件
#ifndef _UI_H
#define _UI_H
void print_UI(const char* str);
#endif

#dal.c文件
#include <stdio.h>
#include "dal.h"

void print_DAL(const char* str)
{
      printf(str);
}

#dal.h文件
#ifndef _DAL_H
#define _DAL_H
void print_DAL(const char* str);
#endif

#bll.c文件
#include <stdio.h>
#include "bll.h"

void print_BLL(const char* str)
{
      printf(str);
}

#bll.h文件
#ifndef _BLL_H
#define _BLL_H
void print_BLL(const char* str);
#endif

  下面看下Makefile文件:

CC=gcc
CFLAGS=-Wall -g
BIN=main
SUBDIR=$(shell ls -d */)
ROOTSRC=$(wildcard *.c)
ROOTOBJ=$(ROOTSRC:%.c=%.o)
SUBSRC=$(shell find $(SUBDIR) -name ‘*.c‘)
SUBOBJ=$(SUBSRC:%.c=%.o)

$(BIN):$(ROOTOBJ) $(SUBOBJ)
    $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
.c.o:
    $(CC) $(CFLAGS) -c $< -o [email protected]
clean:
    rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

  上面通过几个函数跟推导写出来的Makefile文件,至于其意思前面也有相对应的解析了,这个

SUBDIR变量也注意下它是当前目录下目录的集合后面通过find命令查找出这些对于目录下的.c文件;

第五课 Makefile文件的制作(补充),布布扣,bubuko.com

时间: 2024-11-13 15:00:13

第五课 Makefile文件的制作(补充)的相关文章

第四课 Makefile文件的制作(下)

序言: 前面一节课讲解了Makefile的基础知识包括原理.预定义以及命令格式,这样是可以完成一个自动编译的文件,这些知识可以帮你完成.想想mak真是强大啊,可能有些同志发现了如果项目文件太多每个目标文件都要写指令有没有其它的简化来加快开发速度,提高项目的可维护性,答案当然是有的,这就是接下来的要讲解的I?n?f?e?r?e?n?c?e? ?R?u?l?e?s?(?推?导?规?则?),有了这个推导规则是的make更强大. 原理: I?n?f?e?r?e?n?c?e? ?R?u?l?e?s?(?推

Linux基础学习笔记-第五课:文件权限

Linux Linux下一切皆文件,每个文件权限都有属主.属组.其他三个身份,每个身份都有read.write.excute设定 账号配置文件:/etc/passwd 密码配置文件:/etc/shadow 组配置文件: /etc/group 修改系统默认语言:/etc/sysconfig/i18n修改文件属性及权限: chgrp:修改属组 chown:修改属主 chmod:修改权限 权限对于 文件: r:可读取文件实际内容,如文本文件的文字内容 w:可编辑.新增.修改文件的内容,但不包含删除该文

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十五课(文件操作、)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 最近简直要死了 发烧感冒 喉咙痛..... 如何长期保存计算机中数据: 需要文件操作 文件 file: 文件是用于数据存储的单位 文件通常用来长期储存数据 文件中的数据是以字节为单位进行顺序储存的文件的操作流程: 1.打开文件 2.读/写文件 3.关闭文件 注: 任何操作系统, 一个应用程序同时打开文件的数量有最大数限制文件打开函数: open(file, mode='rt')

C语言Makefile文件制作

本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile 写完之后才发现基本上都是一些比较枯燥的规则,看看一.二.八三个部分就可以了.当作参考工具吧,什么时候用到了再来看看. 一.概述 我所使用的make 版本是 GNU Make 3.81,使用的系统是

Makefile文件编写和autotools的使用

在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译:然而在大型的项目开发中,可能涉及几十到几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错.所以在Linux或Unix环境下,人们通常利用GNU make工具来自动完成应用程序的维护和编译工作.实际上,GNU make工具通过一个称为Makefile的文件来

工程管理之makefile与自动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,只有我来给大家全面讲解介绍Linux Makefile系统作为Linux下的程序开发人员,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Linux Mak

【黑马程序员】第12课:文件上传&文件下载&注解

<pre> day12 上节内容回顾 1.jstl的标签 *if  choose *forEach <c:forEachvar="l" items="${list}"> 2.jsp开发模式 *模型一 *模型二(mvc模式) **mvc模式 ***m:模型,使用javabean ***v:视图,使用jsp ***c:控制器,使用servlet *dao模式:数据访问对象,专注于对数据库的操作 **首先创建接口,在接口里面定义操作数据库的方法 *

Linux内核Makefile文件(翻译自内核手册)

转载自:http://www.cnblogs.com/jason-lu/p/3728198.html --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 This document describes the Linux kernel Makefiles 本文当介绍了Linux内核的Makefile === Table of Contents=== 目录

【Linux探索之旅】第四部分第五课:源码编译,安装便利

内容简介 1.第四部分第五课:源码编译,安装便利 2.第四部分第六课:DNS和域名,一探究竟 源码编译,安装便利 这一课相对轻松,毕竟刚跨年(2015-2016)么,新年怎么能让大家一个头两个大呢~ 小编怎么可能这么坏呢?小编是这样的人吗?(是啊 -_-#). 之前的课程([Linux探索之旅]第二部分第七课:软件安装,如虎添翼)中,我们已经了解过Ubuntu这个Linux的发行版下安装软件是何等方便,用apt-get这个工具可以轻松搞定.这种方式可以让我们下载并安装大部分的软件. 其他Linu