makefile 编写要点

#PS:请尊重原创,不喜勿喷

#PS:要转载请注明出处,本人版权所有

#PS:这个只是  《  我自己    》理解,如果和你的原则相冲突,请

谅解,勿喷

最近整理自己的文件时,发现由于太懒的原因,很多资料都来不及整理就忘掉了,很可惜,所以,在整理Makefile时,就把自己作为新手,编写makefile的一些疑问立即写下来.

1 变量赋值

varname=
是最基本的赋值

varname:=
是覆盖之前的值

varname?=
是如果没有被赋值过就赋予等号后面的值

varname+=
是添加等号后面的值

2 几个特殊符号的意义

[email protected]目标文件,

$^--所有的依赖文件,

$<--第一个依赖文件。

3 多目录makefile编写要点

用命令: ${MAKE} -C ${子目录} ${TARGETNAME}

注释:以上命令会切换到子目录,并执行make命令

在子目录建立makefile,做好依赖工作

4 makefile部分函数使用

patsubst(<pattern>,<replacement>,<text>)

功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否

符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括

通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,

<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”

来转义,以“\%”来表示真实含义的“%”字符)

返回:函数返回被替换过后的字符串。

示例:

$(patsubst %.c,%.o,tmp.c.c tmp1.c)

把字串“tmp.c.c tmp1.c”符合模式[%.c]的单词替换成[%.o],返回结果是“tmp.c.o
tmp1.o”

$(strip <string> )

功能:去掉<string>字串中开头和结尾的空字符。

返回:返回被去掉空格的字符串值。

示例:

$(strip abc )

把字串“ abc ”去到开头和结尾的空格,结果是“abc”。

${wildcard <partner>)

功能:src = $(wildcard *.c )

返回:搜索当前目录下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC.当前目录文件只有文件名,子目录下的文件名包含路径信息

${notdir textlist)

使用:src = $(notdir textlist)

返回:去除所有的目录信息,SRC里的文件名列表将只有文件名。

我的makefile实例:

topdir-makefile:

##############################

# file:   Makefile

# author:  sky

# modified-date:  2016-05-07

###############################

export ROOT_DIR := $(shell pwd)

#get out of start and end char‘ ‘ of the string

ROOT_DIR :=$(strip ${ROOT_DIR})

export LIB_DIR:=$(ROOT_DIR)/lib

export SRC_DIR:=$(ROOT_DIR)/src

export INCLUDE_DIR:=$(ROOT_DIR)/include

export TARGET:=test

export CC:=gcc

export
LD_FLAGS:=-l config -pthread

export SRC:=$(wildcard ${SRC_DIR}/*.c)

export OBJ:=$(patsubst %.c,%.o,${SRC})

export OBJ_S:=Y_Start.o Y_ChildProcess.o

#if you want to build release-program , use command: make BUILD_RELEASE=TRUE

ifeq ($(BUILD_RELEASE), TRUE)

export
C_FLAGS:= -I ${INCLUDE_DIR} -std=c99

export BUILD_DIR := $(ROOT_DIR)/release

else

export
C_FLAGS:= -g -D Y_DEBUG -I ${INCLUDE_DIR} -std=c99

export BUILD_DIR := $(ROOT_DIR)/debug

endif

export OLD_OBJ:=$(wildcard ${BUILD_DIR}/*.o)

.PHONY :default all clean

default:all

all :

@${MAKE} -C src all

clean:

@${MAKE} -C src clean

sub-dir-makefile:

.PHONY:all clean

all:${TARGET}

@${CC}  ${OBJ} -o ${TARGET} ${LD_FLAGS}

@mv ${TARGET} ${BUILD_DIR}

@mv ${OBJ} ${BUILD_DIR}

#this is to make test from a static-lib

test_static:${OBJ}

@${CC} ${C_FLAGS} ${OBJ_S} -o test_static -static -L ${LIB_DIR} -l Y_Stdio

#this is to make test from a shared-lib

test_share:${OBJ}

@${CC} ${C_FLAGS} ${OBJ_S} -o test_share -L ${LIB_DIR} -l Y_Stdio

#this is to make a static-lib

libY_Stdio_Static:

@${CC} ${C_FLAGS} -c Y_Stdio.c

@ar -rcs libY_Stdio.a Y_Stdio.o

@mv libY_Stdio.a ${LIB_DIR}

#this is to make a shared-lib

libY_Stdio_Shared:

@${CC} ${C_FLAGS} -fPIC -c Y_Stdio.c

@${CC} -shared -fPIC -o libY_Stdio.so Y_Stdio.o

@mv libY_Stdio.so ${LIB_DIR}

${TARGET}:

@${CC} ${C_FLAGS} -c ${SRC}

#clean target

clean:

@rm  ${OLD_OBJ} ${BUILD_DIR}/${TARGET}

纯手打,难免有出错之处,欢迎指正。

#PS:请尊重原创,不喜勿喷

#PS:要转载请注明出处,本人版权所有

有问题请留言,看到后我会第一时间回复

时间: 2024-10-07 05:26:21

makefile 编写要点的相关文章

linux 下C语言编程库文件处理与Makefile编写

做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目.今天学了2点,一个是库文件处理,另一个是makefile编写. 学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西. gcc的编译过程 首先需要清楚gcc编译做了些什么 源文件

单目录下多文件 makefile编写

makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东西,记录下来,以便后面查阅: 这篇blog要分享的是在单目录下多文件的makefile编写,首先说明当前目录下有多少文件:fun.h   fun.c  main.c  makefile:其中*.c 文件都要依赖 *.h文件: 首先常规编译: 预处理期:gcc  -E  -o fun.i  fun.c

makefile编写---:= ?= += =的区别

在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为:ifdef DEFINE_VRE    VRE = “Hello World!”elseendif ifeq ($(OPT),define)    VRE ?= “Hello World! First!”endif ifeq ($(OPT),add)    VRE += “Kelly!”endif ifeq ($(OPT),recover)   

GNU Makefile编写

[Introduction] make 是程序员很好用的工具,如果存在makefile存在,每次更新代码,执行shell命令 shell 就可以执行所有需要编译的文件,make是根据你编写的Makefile文件和源程序的最后的修改时间来决定哪些文件需要更新重编的. [Introduction to Makefiles] 问题的关键是如何编写一个Makefile文件,我们都是通过Makefile 来告诉make工具怎么去做.一个简单的makefile的规则如下: target ... : prer

makefile编写---.a静态库的生成和调用

#.SUFFIXES: .c .o Cc =gcc #OSA=/data/users/osa IncDir=-I. -I./ Debug = -g Cflags = -c $(DEBUG) Libs = -lpthread Lib_Dir=./#/data/users/osa/api/ #PKIOBJ=PKITool.o kdmd5.o Lib=alg.aPkiObj=alg.o .c.o: $(Cc) $(Cflags) $(IncDir) $*.c all: PKITool #clean P

一个项目的Makefile编写及调试

在src目录下包含很多文件夹,那么需要遍历所有的目录执行Makefile,那么给一个在src目录下的Makefile. # 需要排除的目录 exclude_dirs := include bin # 取得当前子目录深度为1的所有目录名称 DIRS := $(shell find . -maxdepth 1 -type d) DIRS := $(basename $(patsubst ./%,%,$(DIRS))) DIRS := $(filter-out $(exclude_dirs),$(DI

内核Makefile编写

对于大部分内核模块或设备驱动的开发者和使用者来说,最常接触到的就是各层目录下基于kbuild架构的kbuild Makefile文件.主要部分有:1.目标定义,目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核. 最简单的只有一行,如obj-y += foo.o表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,而obj-m则表示该文件要作为模块编译.除了y,m以外的obj-x形式的目标都不会被编译. 由于既可以编译成模块,也可以编译进内核,更常见的做法是根据.co

BAT脚本编写要点_特殊字符

BAT脚本编写要点(1)_特殊字符 分类: 其他 2011-03-20 00:58 5621人阅读 评论(0) 收藏 举报 脚本cdatecmdtreesystem 1. 点 与echo连用,作用是换行 示例1 [输出空行] echo. 2 > 定向符[输出] 将命令的输出进行重定向 [一般用于将结果写入文件] 注意 nul 为空设备 >nul 则用于屏蔽输出内容 [如 pause>nul] 示例2 [向1.txt中写入字符串 wind] echo wind>1.txt 3 >

小型C/C++项目的makefile编写

[前言]在我所接触到的Linux嵌入式开发中,大多使用的是C语言,采用makefile文件对源文件进行编译后生成可执行文件.本文即从个人经历上介绍小型的C项目如何编写makefile文档. 一.gcc命令 从目的上看,gcc命令和makefile的功能是一样,即是把源文件编译后生成可执行文件或.o二进制文件.gcc命令中有许多的额外的参数,本文仅介绍以下几种最简单和常用的方法: 有helloworld.c文件如下: #include <stdio.h> int main() { printf(