MakeFile详解
make makefile 的参数

make makefile 的参数make是一个常用的构建工具,用于自动化编译和构建软件项目。
makefile是make工具的配置文件,用于描述项目的构建规则和依赖关系。
本文将介绍makefile的参数,包括常用的参数及其用法。
一、常用参数及其用法1. -f 文件名:指定makefile的文件名,默认为"makefile"或"Makefile"。
通过该参数,可以使用其他名称的makefile文件。
2. -C 目录:指定make命令的工作目录。
在执行make命令时,会切换到指定的目录,并在该目录下查找makefile文件进行构建。
3. -n:显示执行make命令时的操作,但不实际执行。
通过该参数,可以预览make命令的执行过程,检查构建规则是否正确。
4. -p:显示make命令的内置变量和规则。
通过该参数,可以查看make命令的内部工作机制,了解makefile文件的编写规则和使用方法。
5. -B:强制重新构建目标文件。
通过该参数,可以忽略文件的时间戳,强制重新执行构建规则,生成新的目标文件。
6. -j 并发数:指定make命令的并发执行数。
通过该参数,可以提高构建速度,同时执行多个任务。
7. -s:静默模式,不显示执行的命令。
通过该参数,可以减少输出信息,使构建过程更加清晰。
二、makefile的构建规则makefile由一系列构建规则组成,每个规则定义了目标文件、依赖文件和构建命令。
make命令根据构建规则,自动判断需要更新的文件,并执行相应的构建命令。
构建规则的基本格式如下:目标文件: 依赖文件构建命令其中,目标文件是要生成的文件,依赖文件是目标文件依赖的文件,构建命令是生成目标文件的命令。
构建规则中的目标文件和依赖文件可以是文件名,也可以是变量。
通过使用变量,可以提高makefile的可维护性和灵活性。
构建命令可以是任意的Shell命令,包括编译、链接、拷贝等操作。
linux makefile编写规则

linux makefile编写规则(原创实用版)目录一、Makefile 简介二、Makefile 的规则1.目标文件2.依赖文件3.命令三、Makefile 中的变量1.通用变量2.局部变量四、Makefile 中的路径1.源文件路径2.目标文件路径3.库文件路径五、Makefile 编写实例六、总结正文一、Makefile 简介Makefile 是一个用于自动化构建和编译软件的脚本文件,通常在Linux 系统中使用。
它可以帮助开发者管理源代码,以及确定哪些文件需要编译,如何编译,以及编译后的文件如何链接。
通过编写 Makefile,开发者可以轻松地构建和维护复杂的软件项目。
Makefile 主要包括三类规则:目标文件、依赖文件和命令。
1.目标文件目标文件是 Makefile 中要生成的文件,可以是对象文件、库文件或执行文件。
在 Makefile 中,目标文件通常以“target”关键字开头,后面跟要生成的文件名。
例如:“target = main.o”。
2.依赖文件依赖文件是 Makefile 中要生成目标文件所需要的其他文件,通常是源代码文件。
在 Makefile 中,依赖文件通常以“prerequisites”关键字开头,后面跟要依赖的文件名。
例如:“prerequisites = a.c b.c”。
3.命令命令是用来生成目标文件的命令,通常是编译器或链接器。
在Makefile 中,命令通常以“command”关键字开头,后面跟要执行的命令。
例如:“command = gcc -o main.o a.c b.c”。
三、Makefile 中的变量Makefile 中的变量可以用于存储常量值,以便在 Makefile 中多次使用。
变量分为通用变量和局部变量。
1.通用变量通用变量是在整个 Makefile 中都可以使用的变量。
通用变量通常在Makefile 的开头定义,使用“define”关键字。
windows下makefile命令详解

windows下makefile命令详解1. 如果已经有vc6的dsp⼯程,可直接导出nmake脚本⽂件(.mak)“Project - Export Makefile...”nmake -f nMakeTest.mak CFG="nMakeTest - Win32 Debug"nmake -f nMakeTest.mak CFG="nMakeTest - Win32 Debug" allnmake -f nMakeTest.mak CFG="nMakeTest - Win32 Release" clean注:如果未指定/F选项,则使⽤当前⽬录下的名为makefile的⽂件【nmake /?】获取更多帮助! vc6:【D:\program files\Microsoft Visual Studio\VC98\Bin】vs2008:【D:\program files\Microsoft Visual Studio 9.0\VC\bin】为了能正确地使⽤命令⾏⼯具及vc6或vs2008下的函数库,需要对⼀些环境变量进⾏设置,最快捷地⽅式是通过如下⽅式打开命令⾏窗⼝(以vs2008为例):2. vs的c++⼯程没有提供导出nmake脚本⽂件的功能,我们只有借助⼯具或⼿动编写nmake脚本⽂件了++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3. rc.exe 【将.rc资源⽂本转变成.res⼆进制⽂件】/l 0x804 // 默认语⾔ID(⼗六进制数表⽰) 0x804:简体中⽂ 0x409:美国/fo"nMakeTest.res" // 指定rc⽂件输出的res名称例:rc.exe /l 0x804 /fo"nMakeTest.res" /d "_DEBUG" /d "_AFXDLL" “nMakeTest.rc”4. cl.exe 常见选项【将.c,.cpp,.cxx编译成obj⽂件】/nologo // 不打印版权申明信息/I "../include" // 添加头⽂件查找路径(如果路径中带有空格,⼀定要⽤引号括起来)/DWIN32 // 预编译宏定义(win32程序)/D_CONSOLE // 预编译宏定义(控制台程序)/D "_DEBUG" // 预编译宏定义(Debug版本)/D_CRT_SECURE_NO_DEPRECATE // 预编译宏定义(关闭C4996警告。
简单的驱动makefile解析

Linux 2.6 (PC)简单驱动Makefile详解ifneq ($(KERNELRELEASE),)module-objs := book.oobj-m := book.oelseKERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesendifclean:rm -rf *.o *~core.depend.*.cmd *.ko *.mod.c.tmp versionsKERNELRELEASE 内核顶层目录Makefile的一个变量。
KERNELDIR ?= /lib/modules/$(shell uname -r)/build内核源码树目录。
该Makefile 共读取两次,在输入Makefile时,$(KERNELDIR) 第一次读取KERNELRELEASE并没有被定义,然后就开始读取内核源码的目录,开始定义KERNELRELEASE,然后到当前模块的目录里面,M=$(PWD) 进入该Makefile时KERNELRELEAS已经被定义了,读取要编译的模块,然后再返回到modules编译完成,产生.KO文件Linux 2.6 (ARM)简单驱动Makefile详解ifneq ($(KERNELRELEASE),)obj-m := fgpio011.oelseKDIR := /dsw/8126/arm-linux-2.6.28/linux-2.6.28-fa/all:make -C $(KDIR) M=$(PWD) modules ARCH=armCROSS_COMPILE=arm-none-linux-gnueabi-clean:rm -f *.ko *.o *.mod.o *.mod.c *.symversendif注释:KDIR := /dsw/8126/arm-linux-2.6.28/linux-2.6.28-fa/ KDIR 指定开发板内核所在目录。
makefile中ifdef的用法

makefile中ifdef的用法题目: makefile中的ifndef的用法一、什么是makefile?Makefile是一种用来管理和构建项目的文件,它由一系列的规则组成,指定了如何编译和链接源代码以生成最终的可执行文件或库文件。
Makefile通常用于源代码非常复杂或需要跨平台构建的项目。
二、makefile的条件编译在编写makefile时,我们经常需要根据不同的条件执行特定的编译选项或构建命令。
条件编译是通过使用预处理指令来实现的。
makefile支持两种常用的条件编译指令:ifdef和ifndef。
三、ifndef指令的用法ifndef是"if not defined"的缩写,用于检查某个变量是否已定义。
如果该变量未定义,就执行ifdef指令中的一组命令。
在makefile中,我们可以使用ifndef指令来检查环境变量、宏定义或其他makefile中定义的变量是否已定义。
如果未定义,我们可以执行一组命令来设置默认值或终止构建。
以下是ifndef指令的基本语法:ifndef variable_namecommand1command2...endif四、ifndef指令的示例下面以一个简单的示例来说明ifndef指令的用法。
假设我们正在构建一个C语言项目,并且希望根据操作系统的类型设置不同的编译选项。
在这种情况下,我们可以使用ifndef指令来检查操作系统的环境变量,并根据其值设置不同的编译选项。
以下是一个makefile的示例:ifndef OS(error The OS variable is not defined!)endififeq ((OS), Windows)CC = gccCFLAGS = Wall DWINDOWSelse ifeq ((OS), Linux)CC = gccCFLAGS = Wall DLINUXelse ifeq ((OS), Mac)CC = clangCFLAGS = Wall DMACelse(error Unsupported operating system: (OS))endifall:(CC) (CFLAGS) main.c o my_program在这个示例中,我们首先使用ifndef指令检查OS变量是否已定义。
makefile编写规则 ifeq

makefile编写规则 ifeq什么是makefile?makefile是一种用于自动化构建程序的工具,它能够根据文件之间的依赖关系,自动决定哪些文件需要重新编译。
makefile由一系列规则组成,每个规则定义了如何生成一个或多个目标文件。
make命令会根据这些规则来执行相应的操作,从而实现自动化构建的功能。
ifeq规则的作用在makefile中,ifeq是一种条件语句,用于判断某个条件是否为真。
它的基本语法如下:ifeq (condition, value)# 条件为真时执行的操作else# 条件为假时执行的操作endifcondition是一个条件表达式,可以使用各种比较运算符来进行比较。
value是一个字符串,用于与condition进行比较。
如果condition和value相等,则条件为真,执行ifeq后面的操作;否则条件为假,执行else后面的操作。
ifeq规则的使用场景ifeq规则在makefile中的使用场景很多,下面列举了几个常见的用法:1. 根据不同的操作系统执行不同的操作在跨平台开发中,可能需要根据不同的操作系统执行不同的操作。
可以使用ifeq 规则来判断当前的操作系统,然后执行相应的操作。
ifeq ($(OS),Windows_NT)# Windows系统下的操作CC = clelse# 非Windows系统下的操作CC = gccendif上面的示例中,如果当前操作系统是Windows,则将CC变量设置为cl;否则,将CC变量设置为gcc。
2. 根据变量的值执行不同的操作有时候需要根据某个变量的值来执行不同的操作。
可以使用ifeq规则来判断变量的值,然后执行相应的操作。
ifeq ($(DEBUG),1)# 调试模式下的操作CFLAGS = -gelse# 非调试模式下的操作CFLAGS =endif上面的示例中,如果DEBUG变量的值为1,则将CFLAGS变量设置为-g;否则,将CFLAGS变量设置为空。
make的主要用法

make的主要用法Make是一个常用的构建工具,它可以自动化地编译程序、生成文档、打包发布等操作。
Make最初是Unix系统下的一个工具,现在已经被广泛地应用于各种平台和语言中。
一、Make的基本概念1.1 MakefileMakefile是Make的配置文件,它描述了如何构建目标文件。
Make会根据Makefile中的规则来判断哪些文件需要重新编译,以及如何编译它们。
1.2 目标文件目标文件是指要生成的文件,可以是可执行程序、静态库、动态库等。
在Makefile中,每个目标都有一个对应的规则来描述如何生成它。
1.3 依赖关系依赖关系指的是目标文件与源文件之间的关系。
如果一个目标文件依赖于另外一个文件,那么在生成这个目标文件之前必须先生成它所依赖的那个文件。
1.4 规则规则描述了如何从源代码生成目标代码。
规则由三部分组成:目标、依赖和命令。
其中,目标表示要生成的文件,依赖表示该目标所依赖的其他文件,命令表示如何从依赖中生成目标。
二、Makefile语法2.1 变量定义变量可以用来存储一些常用的值,比如编译器、编译选项等。
变量的定义格式为:变量名=变量值。
2.2 目标规则目标规则描述了如何生成一个目标文件。
目标规则的格式为:目标: 依赖命令其中,目标表示要生成的文件,依赖表示该目标所依赖的其他文件,命令表示如何从依赖中生成目标。
2.3 伪目标伪目标是指不对应任何实际文件的目标,它们通常用来描述一些特殊的操作,比如清空临时文件、打包发布等。
伪目标的名称前面要加上一个“.”号。
2.4 函数Make提供了一些内置函数来方便我们编写Makefile。
常用的函数有:$(wildcard pattern)、$(patsubst pattern,replacement,text)、$(subst from,to,text)等。
三、Makefile实例下面是一个简单的Makefile示例:CC=gccCFLAGS=-Wall -gLDFLAGS=-lmall: hello_world.exehello_world.exe: hello_world.o$(CC) $(LDFLAGS) $< -o $@hello_world.o: hello_world.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f *.o *.exe这个Makefile定义了三个变量:CC表示编译器,CFLAGS表示编译选项,LDFLAGS表示链接选项。
Makefile文件的作用

MakeFile 文件的作用makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定CPP文件的编译来产生特定的OBJ文件.附上原文:Experienced programmers are familiar with makefiles. A makefile stores compiler and linker options and expresses all the interrelationships among source files. (A source code file needs specific include files, an executable file requires certain object modules and libraries, and so forth.) A make program reads the makefile and then invokes the compiler, assembler, resource compiler, and linker to produce the final output, which is generally an executable file. The make program uses built-in inference rules that tell it, for example, to invoke the compiler to generate an OBJ file from a specified CPP file.一、Makefile里有什么?Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引用其它的Makefile-实例
有这样几个Makefile:a.mk、b.mk、c.mk,还有 一个文件叫foo.make,以及一个变量$(bar),其 包含了e.mk和f.mk,那么,下面的语句: include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk
在大多数时候,由于源文件太多,编译生成的中间目标文 件太多,而在链接时需要明显地指出中间目标文件名,这
对于编译很不方便,所以,通常要给中间目标文件打个包,
在Windows 下这种包叫“库文件”(Library File),也就 是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。
定义变量和引用变量
变量的定义和应用与Linux环境变量一样,变量名 要大写,变量一旦定义后,就可以通过将变量名 用圆括号括起来,并在前面加上“$”符号来进行 引用。 变量的主要作用: 1、保存文件名列表 2、保存可执行命令名,如编译器 3、保存编译器的参数 变量一般都在makefile的头部定义。按照惯例, 所有的makefile变量都应该是大写。
者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正
确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应 该对应于一个中间目标文件(O 文件或是OBJ 文件)。
孙钦东
程序的编译和链接
链接时,主要是链接函数和全局变量。链接器并不管函数
所在的源文件,只管函数的中间目标文件(Object File)。
clean: -rm -f $(EXEC) *.elf *.gdb *.o
实例:Hello程序的MakeFile
CC 指明编译器的宏 EXEC 表示生成的执行文件名称的宏 OBJS 目标文件列表宏 LDFLAGS 连接参数宏 All: 编译主入口 Clean: 清除编译结果 Install: 将编译成功的可执行文件安装到系统目 录中,一般为/usr/local/bin目录
Makefile 是什么
GNU make是一个命令工具,是一个用来控制软件构建过程的自动 化管理工具。Make工具通过称为Makefile的文件来完成并自动维护 编译工作,由Richard Stallman 与Roland McGrath设计开发 。
Makefile是用于自动编译和链接的,一个工程有很多文件组成,每 一个文件的改变都会导致工程的重新链接,但是不是所有的文件都 需要重新编译,Makefile中记录有文件的信 息,在make时会决定 在链接的时候需要重新编译哪些文件。
make命令格式:make [-f Makefile] [option] [target]
#make target
#make
#make clean (伪目标)
Makefile 是什么
Makefile的宗旨就是:让编译器知道要编译一个文件
需要依赖其他的哪些文件。当那些依赖文件有了改变,
编译器会自动的发现最终的生成文件已经过时,而重
不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外
一些make只对全小写的“makefile”文件名敏感,但是基本上来说, 大多数的make都支持“makefile”和“Makefile”这两种默认文件名。
当然,你可以使用别的文件名来书写Makefile,比如:
“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定 特定的Makefile,你可以使用make的“-f”和“--file”参数,如: make -f Make.Linux或make --file Make.AIX。
实例:Hello程序的MakeFile
TOPDIR = ../ include $(TOPDIR)Rules.mak EXTRA_LIBS += EXEC = $(INSTALL_DIR)/hello OBJS = hello.o all: $(EXEC) $(EXEC): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS) install: $(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)
新编译相应的模块。
makefile带来的好处就是—“自动化编译”,一旦写
好,只需要一个make命令,整个工程完全自动编译,
极大的提高了软件开发的效率。
Makefile的文件名
默认的情况下,make命令会在当前目录下按顺序找寻文件名为 “GNUmakefile”、“makefile”、“Makefile”的文件,找到了解 释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名, 因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好
其他预定义变量
AR 归档维护程序的名称,默认值为 ar。 ARFLAGS 归档维护程序的选项。 AS 汇编程序的名称,默认值为 as。 ASFLAGS 汇编程序的选项。 CC C 编译器的名称,默认值为 cc。 CFLAGS C 编译器的选项。 CPP C 预编译器的名称,默认值为 $(CC) -E。 CPPFLAGS C 预编译的选项。 CXX C++ 编译器的名称,默认值为 g++。 CXXFLAGS C++ 编译器的选项。 FC FORTRAN 编译器的名称,默认值为 f77。 FFLAGS FORTRAN 编译器的选项。
如:VPATH = src : ../headers
上面的的定义指定两个目录,“src”和“../headers”,make 会按照这个顺序进行搜 索。目录由“冒号”分隔。(当前目录是最高优先搜索的地方)
也可以使用指令vpath,与VPATH在使用上的区别是:vpath可以给不同类文件指定不
同的搜索目录。如: vpath %.c /src vpath %.h ../headers vpath %.c 表示清除所有vpath对%.c设置的搜索目录(后面不带路径)
3、变量的定义。在Makefile中我们要定义一系列的变量,变量一 般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,
其中的变量都会被扩展到相应的引用位置上。
如:H: =foo.c
gcc -o foo.o $(H) (赋值可以用: =也可以直接用 =)
4、文件指示。其包括了三个部分,一个是在一个Makefile中引用 另一个Makefile,就像C语言中的include一样;另一个是指根据某 些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样; 还有就是定义一个多行的命令。
3个常用的预定义变量
1. $@ 2. $^ 3. $< 表示要生成的目标 表示全部的依赖文件 表示第一个依赖文件 bin/cn_work : obj/main.o obj/cn_work.o obj/fun.o gcc $^ -o $@ (命令一定要用以Tab开头) obj/cn_work.o : sources/cn_work.c gcc -I headers -c obj/main.o : obj/fun.o : clean: rm -f bin/cn_work file_o/*.o gcc -I headers -c gcc -I headers -c $< $< $< -o $@ -o $@ -o $@ gcc 的3个参数: 1. -o 指定目标文件 gcc sources/main.c -o bin/main 2. -c 编译的时候只生产目标文件不链接 gcc -c sources/main.c -o obj/main.o 3. -I 主要指定头文件的搜索路径 gcc -I headers -c main.c -o main.o sources/main.c sources/fun.c
孙钦东
gcc 参数
GCC –c 编译成把源文件目标代码,不做连接的动作。 –d 在执行过程中打印出所有的调试信息 –S 把源文件编译成汇编代码,不做汇编和连接的动作。 –E 只把源文件进行预处理之后的结果输出来。不做编译, 汇编,连接的动作。 –o file 指明输出文件名是file。 –g 把调试开关打开,让编译的目标文件有调试信息。 -O1 –O2 –O3 –O0,这些开关分别控制优化的强度,-O3 最强。
Makefile里有什么?
Makefile里主要包含了五个东西:显式规则、隐含规则、变量定义、
文件指示和注释。
1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由 Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
如: foo.o : foo.c defs.h
Makefile里有什么?
5、注释。Makefile中只有行注释,和UNIX的 Shell脚本一样,其注释是用“#”字符,这个就 像C/C++,Java中的“//”一样。
在Makefile中的命令,必须要以[Tab]键开始。
设置makefile中文件的搜索路径
在makefile中,可以通过给VPATH赋值来设置规则中目标文件和依赖文件的搜索目录。 Make首先搜索当前目录,如果未找到依赖的文件,make将按照VPATH中给的目录依 次搜索VPATH对makefile中所有文件都有效。
依赖关系
gcc -o foo.o foo.c 生成目标的方法(方式)
2、隐含规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让 我们比较粗糙地简略地书写Makefile,这是由make所支持的。 如: foo.o : foo.c (.o文件自己推导出同名的依赖文件.c.)