第五课 Makefile文件的制作(补充)
序言:
前面的几节课讲解Makefile的一些基本知识也做了一些小例子实践了几下,那么到现在普通的练习则是没有问题。但是如果做项目文件较多又分层次等等还是会碰上好多问题的,这节课补充一些知识。
知识点:
1.makefile的内嵌函数;
2.二级目录Makefile的编写;
3.多级目录Makefile的编写;
原理:
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 $@
clean:
rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)
上面通过几个函数跟推导写出来的Makefile文件,至于其意思前面也有相对应的解析了,这个
SUBDIR变量也注意下它是当前目录下目录的集合后面通过find命令查找出这些对于目录下的.c文件;
上面的代码只能支持到二级目录,代码是由SUBDIR决定了它只找到了二级目录的文件!现在想想如果是二级目录下还有目录即是多级目录Makefile编写(也可以是Makefile生成多个可执行文件)那怎么办呢,有什么办法了解决呢?这里就需要用到一个命令:make bll/ TARGET=all ;其中all是可执行文件或是伪目标。下面看看二级目录的Makefile文件的编写:
SUBDIRS=test #定义二级目录
.PHONY:default all clean $(SUBDIRS) #定义多个伪目标
default:all #这个相当于每月作用后面没命令 all clean: #all 或是 clean 就执行下面命令,但是是没有依赖文件,也就是直接执行命令
$(make) $(SUBDIRS) TARGET=$@ #这句相当于:make test TARGET=all
$(SUBDIRS) #
$(make) -C $@ $(TARGET) #进入文件夹传递all调用Makefile,命令其实就是:make -C test/Makefile all
test目录下的Makefile文件:
CC=gcc
BIN=test
OBJS=test.o
CFLAGS=-Wall -g
.PHONE: all clean print #传递all
all:print $(BIN) #目的是打印信息
print:
@echo "make in $(BIN)......"
$(BIN):$(OBJS)
$(CC) $(OBJS) -o $@
.o:.c
$(CC) -c $<
clean:
@echo "rm......"
rm -f $(BIN) #(OBJS)
相信这个代码都能明白了,下面的就不注释比较简单跟之前的一样。这个在进入跟退出文件夹时会有输出这样在看起来高大上哦!!!
第五课 Makefile文件的制作(补充)的更多相关文章
- 第三课 Makefile文件的制作(上)
1.序言: 前面的课程讲解了从gcc编译过程到其实践,大家可以看到其实在这些步骤中有些是可以简化编译的,但由于参数多以及项目中文件数量多的原因难免会造成错误甚至是浪费大量的时间在这编译上,为此linu ...
- 第四课 Makefile文件的制作(下)
1序言: 前面一节课讲解了Makefile的基础知识包括原理.预定义以及命令格式,这样是可以完成一个自动编译的文件,这些知识可以帮你完成.想想mak真是强大啊,可能有些同志发现了如果项目文件太多每个目 ...
- 让你提前认识软件开发(17):makefile文件的书写及应用
第1部分 又一次认识C语言 makefile文件的书写及应用 [文章摘要] makefile用于Linux下整个project的编译.对于Linux下的C/C++语言的编译是至关重要的. 本文以实际的 ...
- Shell脚本——make命令和Makefile文件【转】
https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...
- makefile文件制作入门
一.首先,看一下最简单的C文件 //hello.c文件 #include <stdio.h> void main() { printf("hello world\n") ...
- C语言Makefile文件制作
本文摘抄自“跟我一起写Makefile ”,只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org.cn/%E8%B7% ...
- Contiki 2.7 Makefile 文件(五)
4.第四部分 (1) oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}} 自定义函数,$(1)表示调用oname这个函数的第一个参数,patsub ...
- linux中Makefile文件相关内容
第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...
- Linux内核Makefile文件(翻译自内核手册)
--译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...
随机推荐
- linux远程控制windows
我的开发环境是linux,但是需要同时维护windows和linux的服务器,所以有时需要在linux系统下也能远程控制windows的机器. rdesktop是一款开源的远程连接工具,它通过实现了R ...
- C0301 代码块{}的使用,重定向, 从文件中读取行
#!/bin/bash # 从 /etc/fstab 中读行 File=/etc/fstab { read line1 read line2 } < $File # {}代码块, ...
- 第二百二十三节,jQuery EasyUI,ComboBox(下拉列表框)组件
jQuery EasyUI,ComboBox(下拉列表框)组件,可以远程加载数据的下拉列表组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 C ...
- 第一百五十三节,封装库--JavaScript,表单验证--备注字数验证
封装库--JavaScript,表单验证--备注字数验证 效果图 html <div id="reg"> <h2 class="tuo"> ...
- SQLServer2008设置开启远程连接
SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置: 1,SQL Serve ...
- 蓝桥杯 第四届C/C++预赛真题(3) 第39级台阶(递归)
题目标题: 第39级台阶 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶 ...
- MySQL中的日期和时间函数
常用日期函数如下: 函 数 功 能 CURDATE() 获取当前日期 CURTIME() 获取当前时间 NOW() 获取当前的日期和时间 UNIX_TIMESTAMP(date) 获取日期的U ...
- 编写高质量代码--改善python程序的建议(七)
原文发表在我的博客主页,转载请注明出处! 建议三十四:掌握字符串的基本用法 编程有两件事,一件是处理数值,另一件是处理字符串,在商业应用编程来说,处理字符串的代码超过八成,所以需要重点掌握. 首先有个 ...
- TADDConnetion组件,TADOQuery
一.TADDConnetion 二.TADOQuery 1.RecNo:从1开始 当前记录行数;ADOQuery1.RecNo 选择后一行数据集内容:ADOQuery1.RecNo:=ADOQuery ...
- word2007的配置进度怎么产生的?如何解决?
那么要怎么解决这个问题呢?既然是安装的,那么我们便道安装控制器文件夹下面去找原因.在WIN8操作系统下,文件夹位于:C:\Program Files (x86)\Common Files\Micros ...