C++学习笔记25:makefile文件2

Makefile文件语法

行解析:命令按行解析

命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进

换行:命令太长时,行尾使用"\"换行

注释:行首字符为“#”的文本行

关闭回显:在行首字符后和命令前添加“@”

  • 未关闭回显时,make会首先回显(打印)命令,然后执行该命令
  • 通常仅在注释和纯显示的echo命令前使用此功能

include filename:包含其他文件

  • 处理模式与c/c++类似
  • 行首加“-”:忽略文件包含错误

通配符

“*”(任意数目的任意字符),例如“*.c”表示所有的.c文件

“?”(任意一个字符)例如:?.c表示单字符文件名

“[abc]”(存在括号内的某个字符),例如“lib[abc].c”表示第四个字符为a,b,或者c

“[0-9]"(存在该集合中的某个字符)

“[^abc]”(存在非括号内的某个字符)

变量

基本变量定义:var_name = value

$(变量名称):引用变量(中间无多余空格);shell变量用"$$",例如:@echo $$HOME

变量在使用时展开,形式上类似宏替换

变量的使用场合:目标,先决条件,命令,新的变量

内置变量

$(CC):当前使用的编译器;$(MAKE):当前使用的make工具

自动变量

[email protected]:当前目标;$<:当前目标的首个先决条件;

$?:比目标更新的所有先决条件

$^:所有先决条件

$(@D)和$(@F):[email protected]的目录名和文件名;

$(<D)和$(<F):$<的目录名和文件名

例子:

#makefile样本

objs = main.o library.o

prog:$(objs)

  $(CC) -o prog $(objs)

  @echo "constructed..."

main.o:main.c library.h

  $(CC) -c main.c

library.o:library.c library.h

  $(CC) -c library.c

.PHONY:clean

clean:

  rm -f prog $(objs)* ~

备注:~为生成的备份文件

变量定义格式

var_name = value :在执行时扩展,允许递归,可以使用后续代码中出现的值

var_name = value :在定义时扩展,不允许递归,使用右侧的现值,不能使用后续代码中出现的值

var_name ?= value:只有在该变量为空时才设置值,否则维持原值

var_name += value:将值追加到变量的尾部;若变量未定义,则“+=”自动解释为“=” ;若便令已定义,则“+=”继承上次的操作符,并追加新的值

多行变量

define var_name

  @echo "One"

  @echo "Two"

endef

define 和 endef 行首字符不能为Tab键,对齐时可使用空格

引用:$(var_name)

多行变量主要用于定义命令包,使用时要特别小心,展开时有可能导致脚本错误

目标变量:类似局部变量 ,仅对本目标规则链有效

-target...:var_name = value:定义目标变量

静态模式:以“%”通配

target...:target-pattern:prerequisites...

[Tab键]commands

目的:用于处理模式相同的多目标,简化脚本代码

例子:每个目标的文件以“.o”结尾,先决条件为对应的“.c”

objs = main.o library.o

$(objs):%.o:%.c

  $(CC) -c $(CFLAGS) $< -o [email protected]

以上等价于:

main.o:main.c

  $(CC) -c $(CFLAGS)main.c -o main.o

library.o:library.c

  $(CC) -c $(CFLAGS)library.c -o library.o

条件判断基本格式

conditional-directive

  text-if-true

endif

----------------------------------

或者

conditional-directive

  text-if-true

else

  text-if-true

endif

-------------------------------------

可用的条件判断

判断两个参数是否相等

ifeq(arg1,arg2),ifeq ‘arg1‘ ‘arg2‘

ifeq "arg1"  "arg2"

判断两个参数是否不相等(同上)

判断某个变量是否已定义:ifdef variable_name

判断某个变量是否未定义:ifndef variable_name

循环:可以在makefile中使用shell循环

rulefor:

  for filename in `echo $(objs)`;\

  do \

    rm -f $$filename;\

  done

注意事项

  循环为shell循环,为保证多行命令在同一个进程中执行,必须合并成单条命令并在行尾添加分行标示

可以使用反引号执行命令,所获得的结果集合可以作为循环的处理集合

filename本身是shell变量,需要使用“$$”引用

函数:像变量一样使用"$()"标识

$(function arg1,arg2,...):函数调用,函数名字为function,后跟着逗号分隔的参数列表,函数参数前后不能有多余的空格

$(subst from,to,text):make的字符串替换函数,将text中的from字符串替换为to,返回替换后的字符串

例子:

comma := ,

#定义空值

empty:=

#定义空格

space := $(empty) $(empty)

foo := a b c

#将“a b c”替换为“a,b,c”

bar := $(subst $(space) $(comma) $(foo))

时间: 2024-10-21 04:36:27

C++学习笔记25:makefile文件2的相关文章

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

Linux 程序设计学习笔记----Linux下文件类型和属性管理

转载请注明出处:http://blog.csdn.net/suool/article/details/38318225 部分内容整理自网络,在此感谢各位大神. Linux文件类型和权限 数据表示 文件属性存储结构体Inode的成员变量i_mode存储着该文件的文件类型和权限信息.该变量为short int类型. 这个16位变量的各个位功能划分为: 第0-8位为权限位,为别对应拥有者(user),同组其他用户(group)和其他用户(other)的读R写W和执行X权限. 第9-11位是权限修饰位,

python基础教程_学习笔记21:文件和素材

文件和素材 打开文件 open函数用来打开文件,语法如下: open([name[,mode[,buffering]]) open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象.模式(mode)和缓冲(buffering)参数都是可选的. >>> f=open(r'D:\software(x86)\Python27\README.txt') 如果文件不存在,则出现错误: >>> f=open(r'D:\software(x86)\Python27\READM

JAVA学习笔记 -- 把资源文件打包到jar包

初学GUI,用Eclipse导出jar包,设定的最小化图标不能显示(hello.png文件放在项目的根目录下).代码如下: import javax.swing.JFrame; import java.awt.Toolkit; import java.awt.Image; import java.net.URL; public class GUITest { public static void main(String[] args) { JFrame frame = new JFrame();

Lua学习笔记8:文件读写

lua中文件读写经常在游戏配置中用到,比如客户端的音效音乐开关等. Lua官方API文档:点这里 I/O库为文件操作提供4个主要函数:io.open(),io.read(),io.write和io.close(). io.open(文件路径,打开方式):以指定方式打开一个文件,打开成功返回一个文件句柄,失败返回nil和错误描述. 可以传入以下六种打开方式: "r":读模式(默认): "w":写模式: "a":附加模式: "r+"

C++学习笔记25,永远将析构函数声明为virtual

要永远记得将析构函数声明为virtual----><<effective c++>> 或许你觉得这句话不一定对,但无需质疑的是这句话是很有用的. 查看下面的例子: #include <iostream> #include <string> using namespace std; class B{ public: ~B(){ cout<<"base is destroyed!"<<endl; } }; cla

Android学习笔记之mainfest文件中android属性

Android学习笔记之mainfest文件中android属性 - Impossible is nothing - 博客频道 - CSDN.NET 以前的零散笔记, 共享一下, 有错误的地方还请指正. android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务.---------------------------------------------------------------------------------

Linux 程序设计学习笔记----ANSI C 文件I/O管理

转载请注明出处:http://blog.csdn.net/suool/article/details/38129201 问题引入 文件的种类 根据数据存储的方式不同,可以将文件分为文本文件和二进制文件.具体的区别和关系如下: 文本文件与二进制文件在计算机文件系统中的物理存储都是二进制的,也就是在物理存储方面没有区别都是01码,这个没有异议,他们的区别主要在逻辑存储上,也就是编码上. 文本文件格式存储时是将值作为字符然后存入其字符编码的二进制,文本文件用'字符'作为单位来表示和存储数据,比如对于1

thinkphp学习笔记2—入口文件

原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如:D:\thinkphp\ThinkPHP,名字是ThinkPHP.php. thinkphp采用的是单一入口模式,所有的程序都是从项目入口文件开始执行的,项目入口文件内容包括: 定义框架路径,项目路径和项目名称(可选) 定义调试模式和运行模式相关变量(可选) 载入框架入口文件(必须) 在手册里面讲到

Windows phone 8 学习笔记(2) 数据文件操作(转)

Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式. 快速导航:一.分析各类数据文件存储方式二.安装文件夹三.本地文件夹(独立存储空间)四.媒体库操作五.本地数据库 一.分析各类数据文件存储方式 1)安装文件夹 安装文件夹即应用安装以后的磁盘根文件夹,它提供只读的访问权限.它在手机中对应的路径为" C:\Data\Programs\{XXXXXXX