Makefile 使用总结 - wang_yb - 博客园
- 格式:pdf
- 大小:2.38 MB
- 文档页数:19
makefile的用法Makefile是一种用于自动化编译程序的工具,它可以根据源代码文件的依赖关系,自动编译出最终的可执行文件。
Makefile的使用可以大大提高程序的开发效率和可维护性,下面我们来详细了解一下Makefile的用法。
一、Makefile的基本语法Makefile的基本语法由一系列规则组成,每个规则由以下几部分组成:1. 目标(Target):表示需要生成的文件名或者是一个伪目标,如clean。
2. 依赖(Prerequisites):表示生成目标所依赖的文件或者是其他目标。
3. 命令(Command):表示生成目标的具体命令。
例如,下面是一个简单的Makefile规则:```hello: main.o hello.ogcc -o hello main.o hello.omain.o: main.cgcc -c main.chello.o: hello.cgcc -c hello.c```这个Makefile规则表示需要生成一个名为hello的可执行文件,它依赖于main.o和hello.o两个目标文件。
生成hello文件的具体命令是gcc -o hello main.o hello.o。
同时,main.o和hello.o两个目标文件分别依赖于main.c和hello.c两个源代码文件,生成它们的具体命令是gcc -c main.c和gcc -c hello.c。
二、Makefile的常用命令1. make:执行Makefile文件,生成目标文件。
2. make clean:删除所有生成的目标文件。
3. make install:将生成的目标文件安装到指定的目录中。
4. make uninstall:卸载已经安装的目标文件。
5. make help:显示Makefile文件中定义的所有规则。
三、Makefile的高级用法1. 变量Makefile中可以定义变量,用于存储一些常用的参数或者路径。
makefile输出总结【原创版】目录1.Makefile 简介2.Makefile 的输出3.Makefile 输出的格式4.Makefile 输出的优点5.总结正文1.Makefile 简介Makefile 是一种构建脚本,用于自动化构建和编译软件项目。
它通常包含一系列的规则和指令,用于描述项目的构建过程。
Makefile 最早用于 Unix 系统,但现在已经广泛应用于各种操作系统和编程语言中。
2.Makefile 的输出Makefile 的输出是指在执行 Makefile 后,系统生成的文件或结果。
这些输出通常包括编译后的目标文件、可执行文件和库文件等。
Makefile 的输出可以帮助开发者快速了解项目的构建状态,以便进行调试和测试。
3.Makefile 输出的格式Makefile 的输出格式通常遵循一定的规范,例如在输出文件名前加上“@”符号,表示该文件是由 Makefile 生成的。
另外,Makefile 还可以通过设置输出变量,来控制输出的格式和内容。
4.Makefile 输出的优点Makefile 输出的优点主要体现在以下几个方面:(1)自动化:Makefile 可以自动化执行构建过程,提高开发效率。
(2)可维护性:Makefile 可以将项目的构建过程描述得非常清晰,便于维护和修改。
(3)可扩展性:Makefile 可以通过调用其他脚本和程序,来实现更复杂的构建逻辑。
(4)跨平台性:Makefile 可以在各种操作系统和编程语言中使用,具有一定的通用性。
5.总结总之,Makefile 是一种非常实用的构建脚本工具,可以帮助开发者自动化项目的构建过程,提高工作效率。
python makefile 用法Python Makefile可用于自动化编译,构建和测试Python项目。
它是一个命令脚本,帮助程序员在不同的操作系统上拥有相同的构建环境,减少了跨平台应用的开发难度。
本文将详细介绍Python Makefile的使用方法,包括如何创建,配置和使用Makefile,以及常见的Makefile命令和技巧。
创建Python Makefile要创建Python Makefile,您需要使用任何文本编辑器创建一个Makefile文件。
Makefile文件通常命名为Makefile或makefile,并位于项目根目录中。
在Makefile文件中,您需要定义一组规则,以指定每个目标的依赖关系,命令和操作。
以下是一个简单的Makefile示例,用于编译和执行名为myapp.py的Python 应用程序。
```make # Makefile for the myapp Python application# Define the application file APPNAME = myapp.py # Define the Python interpreter PYTHON = python3all: $(PYTHON) $(APPNAME)# Define the clean rule clean: rm -f *.pyc ```在上面的Makefile中,我们定义了两个规则,一个是`all`,另一个是`clean`。
`all`规则定义如何构建我们的应用程序,`clean`规则定义如何清理构建期间生成的文件。
配置Python Makefile在编写Python Makefile时,您需要配置Python解释器和其他环境变量。
以下是一些常见的Makefile变量和用法:- **PYTHON**:Python解释器的命令。
在大多数情况下,它需要设置为python3。
- **PYFLAGS**:Python解释器的选项和参数,例如“-O”(优化),“-m”(运行包的主模块)等。
python makefile 用法在使用Python编写程序时,我们通常需要编译和运行代码,这就需要用到makefile。
makefile是一种可以自动化地构建程序的工具,它可以根据代码修改的情况自动判断哪些文件需要重新编译,从而提高程序的编译效率。
使用makefile的基本步骤如下:1. 创建一个名为makefile的文件,通常放在程序的根目录下。
2. 在makefile中定义一些变量,如编译器、编译选项等。
3. 定义一些规则,如编译规则、目标规则等。
4. 运行make命令,根据makefile的规则进行编译和链接。
下面是一个简单的makefile示例:```# 定义编译器和编译选项CC=gccCFLAGS=-Wall -g# 定义编译规则%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# 定义目标规则main: main.o sub.o$(CC) $(CFLAGS) main.o sub.o -o main# 清除中间文件clean:rm -f *.o main```在这个示例中,我们定义了两个变量CC和CFLAGS,分别表示编译器和编译选项。
接着定义了一个编译规则,表示将.c文件编译成.o文件的过程。
其中,$<表示依赖文件(即输入文件),$@表示目标文件(即输出文件)。
最后定义了一个目标规则,表示将main.o和sub.o链接成可执行文件main。
最后,我们定义了一个清除中间文件的规则,可以通过运行make clean来清除中间文件。
可以通过运行make命令来编译和链接程序。
例如,如果你有一个名为main.c和sub.c的源文件,并想将它们编译成可执行文件main,可以在终端中输入以下命令:```$ make main```这将根据makefile中定义的规则自动编译和链接程序,并生成可执行文件main。
总之,makefile是一个非常有用的编译工具,可以帮助我们自动化地构建程序,提高编译效率。
makefile 语法makefile是一种常用的自动化构建工具,它可以帮助我们将源代码编译、链接、打包等一系列操作自动化完成。
在软件开发中,makefile 已经成为了不可或缺的工具之一。
本文将介绍 makefile的语法及其用法,希望能够帮助读者更好地理解和使用 makefile。
一、makefile 的基本语法makefile 的基本语法包括目标、依赖、命令三个要素。
下面我们来逐一介绍。
1. 目标目标是指要生成的文件,也就是 makefile 的最终输出。
目标通常是一个可执行文件、一个库文件或者一个归档文件。
在 makefile 中,目标通常以文件名的形式出现。
例如:```app: main.c func.c```这里的“app”就是目标。
2. 依赖依赖是指生成目标所需要的文件或者其他目标。
在 makefile 中,依赖通常以文件名的形式出现。
例如:```app: main.c func.c```这里的“main.c”和“func.c”就是依赖。
3. 命令命令是指生成目标所需要执行的命令。
在 makefile 中,命令通常以“TAB”键开头,并且必须与目标或者依赖之间有一个空格。
例如:```app: main.c func.cgcc main.c func.c -o app```这里的命令是“gcc main.c func.c -o app”。
二、makefile 的实例了解了 makefile 的基本语法后,我们来看一个简单的makefile 实例:```app: main.c func.cgcc main.c func.c -o app```这个 makefile 的作用是将“main.c”和“func.c”编译成一个可执行文件“app”。
如果我们在命令行中执行“make”命令,make 就会自动根据 makefile 中的规则来生成目标文件“app”。
三、makefile 的高级语法除了基本语法之外,makefile 还有一些高级语法,如变量、函数、条件语句等。
Makefile 是一个用于自动编译和链接的配置文件,它通常用于管理大型项目的编译过程。
Makefile 定义了一系列的规则和依赖关系,用于指定如何生成目标文件。
Makefile 的基本用法如下:1. 定义目标文件:在Makefile 中,每个规则都有一个目标文件,这个目标文件是规则中所有命令的输出文件。
目标文件使用空格分隔,每个目标文件之间用tab 键进行缩进。
2. 定义依赖文件:规则中的依赖文件是生成目标文件所需的文件。
如果没有找到这些依赖文件,规则中的命令将不会被执行。
3. 定义命令:规则中的命令是用来生成目标文件的。
在命令前必须有一个tab 键进行缩进。
在Makefile 中,还可以使用伪目标(phony target)来指定特定的动作或命令,而不需要生成任何文件。
例如,可以使用“clean”作为伪目标,执行清理操作的命令。
下面是一个简单的Makefile 的例子:```makefile# 目标文件:main.omain.o: main.cgcc -c main.c -o main.o# 目标文件:mainmain: main.ogcc main.o -o main```这个Makefile 定义了两个规则:一个是生成main.o 目标文件,另一个是生成main 目标文件。
生成main.o 目标文件需要main.c 文件作为依赖文件,并执行gcc -c main.c -o main.o 命令。
生成main 目标文件需要main.o 文件作为依赖文件,并执行gcc main.o -o main 命令。
使用Makefile 时,需要注意以下几点:1. Makefile 的语法非常简单,但要编写高效的Makefile 需要对项目的结构和依赖关系有深入的了解。
2. Makefile 中的规则必须遵循一定的格式,否则无法正确执行。
3. 在Makefile 中使用变量和条件语句可以提高Makefile 的可读性和灵活性。
makefile基本使用方法makefile是一种用来管理和自动化构建程序的工具。
它可以根据源代码文件的依赖关系和编译规则来自动构建目标文件和可执行文件。
makefile的基本使用方法如下:1. 创建makefile文件:在项目的根目录下创建一个名为makefile 的文件。
2. 定义变量:在makefile中,可以使用变量来存储一些常用的参数和路径,以便于后续的使用。
例如,可以定义一个名为CC的变量来指定编译器的名称,如:CC=gcc。
3. 编写规则:在makefile中,可以使用规则来指定如何编译源代码文件和生成目标文件。
一个规则由两部分组成:目标和依赖。
目标是要生成的文件,依赖是生成目标文件所需要的源代码文件。
例如,可以编写以下规则:```target: dependency1 dependency2command1command2```其中,target是目标文件,dependency1和dependency2是依赖的源代码文件,command1和command2是生成目标文件所需要执行的命令。
4. 编写默认规则:在makefile中,可以使用一个默认规则来指定如何生成最终的可执行文件。
默认规则的目标通常是可执行文件,依赖是所有的源代码文件。
例如,可以编写以下默认规则:```all: target1 target2```其中,target1和target2是生成的目标文件。
5. 编写clean规则:在makefile中,可以使用clean规则来清理生成的目标文件和可执行文件。
例如,可以编写以下clean规则: ```clean:rm -f target1 target2```其中,target1和target2是要清理的目标文件。
6. 运行make命令:在命令行中,使用make命令来执行makefile 文件。
make命令会自动根据规则和依赖关系来编译源代码文件和生成目标文件。
例如,可以运行以下命令:``````make命令会根据makefile文件中的规则和依赖关系来编译源代码文件并生成目标文件和可执行文件。
1:在编译时,编译器只检测语法和函数、变量是否声明如果函数未被声明,编译器会给出一个警告,但可以生成object file2:makefile的规则:如果依赖文件比目标文件新的话或者目标文件不存在,就会执行后续定义的命令这里会比较它们的修改日期如果工程没有编译过,所有c文件都会被编译链接如果只是工程的某几个c文件被修改,那么只编译这几个如果头文件被修改,那么只编译包含头文件的c文件3:make是怎样工作的3.1:读入所有的Makefile读入被include的Makefile在当前目录下面找名字为”Makefile”或”makefile”的文件make 执行时-l后面参数指定的目录3.2初始化文件中的变量3.3:推导隐晦规则,并分析所有规则3.4:为所有的目标文件创建依赖关系链3.3:找第一个目标文件3.4:如果目标文件不存在或者依赖文件比目标文件新,就会执行下一行的命令否则就不会执行下一行的命令而是去寻找依赖文件的依赖3.5:得到新的依赖文件后,由于依赖文件比目标文件新,所以就会执行目标文件中的下一行的命令3.5:所有说目标文件的相关命令是最后被执行的4:清空目标文件的规则伪目标不是文件,无法生成它的依赖文件和决定它是否要执行我们只有显示的指明这个目标才能让其生效.PHONY表明是否有这个文件,这个目标就是一个伪目标.PHONY:cleanclean:-rm edit $(objects)#加上一个减号的含义是:某些文件会出问题但不影响后续操作5:通配符~和HOME$<:所有的依赖集$@:目标集6:文件搜寻:当前目录;也可以在文件前加上路径;VPATH执行的路径,多个路径间用冒号关键字vpath指定不同的文件在不同的目录<pattern>需要包含% 字符vpath <pattern> <dir>vpath <pattern>清除符合模式的文件的搜索目录vpath 清除已经设置好的文件搜索目录7:静态模式<targets...>:<target-pattern...>:<prerq-pattern...>objects = foo.o bar.o$(objects): %.o: %.c#target定义了一系列的目标文件,是目标的一个集合#prerq-pattern是目标的依赖的模式,它是对target-pattern形成的模式在进行一次依赖目标的定义#其计算方法是,取<target-parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合自动生成依赖性:为每一个 name.c的文件生成一个 name.d的文件[.d]文件中存放着[.c]文件的依赖关系%.d:%.c@set -e;rm -f $@;\$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\rm -f $@.$$$$sed命令的显示:https:///edwardlost/archive/2010/09/17/1829145.html目的:在编译器生成的依赖关系中加入[.d]文件的依赖main.o : main.c defs.h替换为:main.o main.d: main.c defs.h把自动生成的Makefile加入到我们的Makefile中sources = foo.c bar.cinclude $(sources:.c=.d)8:显示命令:命令前加上@则不会显示make 参数-s 则会全面机制参数的显示make -n 或者--just-print 只是显示命令不会执行适合用来调试make -w 在进入每一个子makefile会显示工作目录,-C 参数默认加上-w9:命令的依赖:两条命令之间用分号,而不是单独的两行10:嵌套执行makeSubsys:cd sub && make等同于make -C sub总控的makefile的变量会传递到下面的makefile(如果显示声明)export variable但是不会覆盖下面的makefile,除非加上参数-e如果传递所有的变量export如果不想传递某个变量unexport varible11:变量的定义A=${b} #右侧中的变量并不一定是已经定义好的变量造成的问题是:死锁A:=$(B) #右侧的变量必须是已经定义好的FOO ?= bar #如果左侧的变量已经被定义,则什么都不做,如果没有被定义就会定义A += B 属于变量的追加12:变量替换的两种方法${var:a=b} 例如foo := a.o b.o c.obar := $(foo:.o=.c)${var:%.o:%.c}12:函数的调用语法:${<function> <arguments>}函数名和参数之间用空格隔开,参数之间用逗号13:字符串处理函数$(subst <from>,<to>,<text> )$(patsubst <pattern>,<replacement>,<text> )#$(patsubst %.c,%.o,x.c.c bar.c)$(strip <string> )功能:去掉<string>字串中开头和结尾的空字符$(findstring <find>,<in> )功能:在字串<in>中查找<find>字串$(filter <pattern...>,<text> )以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。
makefile的使用一、什么是makefilemakefile是一种用来描述和指导如何编译和构建程序的文件。
它记录了源文件之间的依赖关系和编译规则,通过解析makefile文件,可以自动化地编译和构建程序。
二、为什么要使用makefile使用makefile有以下几个优点:1.自动化编译: makefile可以在编译过程中自动判断哪些文件需要重新编译,从而减少重复编译的时间和工作量。
2.简化构建流程: makefile可以将复杂的构建过程和编译命令封装成一个命令,简化构建流程,提高工作效率。
3.管理项目依赖: makefile可以记录文件之间的依赖关系,当某个文件发生变化时,只需要重新编译与之相关的文件,从而加快构建速度。
4.提高可维护性: makefile使得代码的组织结构更加清晰和可维护,便于团队协作和后续维护。
三、makefile的基本语法makefile的语法较为简单,包括以下几个基本元素:1.目标(target): 目标是构建过程中的一个步骤或者一个文件,并且有依赖关系。
在makefile中,目标通常是一个需要构建的文件,也可以是一个执行命令的动作。
2.依赖关系(prerequisites): 依赖关系是指目标所依赖的文件或者其他目标。
当一个目标的依赖发生变化时,该目标需要重新构建。
3.命令(command): 命令是指构建过程中的具体操作。
在makefile中,每个目标可以指定一个或多个命令,用于构建该目标。
4.变量(variable): 变量是makefile中定义的一个数据容器,用于存储常量或者计算结果。
可以通过引用变量来简化makefile的书写和维护。
5.规则(rule): 规则是指一个目标和其依赖关系的完整定义,包含了目标、依赖关系和命令。
下面是一个简单的makefile示例:# 定义变量CC = gccCFLAGS = -Wall -O2# 定义目标及其依赖关系和命令hello: main.o utils.o$(CC) $(CFLAGS) -o hello main.o utils.o# 定义目标的依赖关系和命令main.o: main.c utils.h$(CC) $(CFLAGS) -c main.cutils.o: utils.c utils.h$(CC) $(CFLAGS) -c utils.c四、makefile的工作流程makefile的工作流程包括以下几个步骤:1.读取makefile文件: make工具会首先读取当前目录下的makefile文件,如果没有找到,则会寻找默认的文件名(GNUmakefile、makefile或Makefile)。
这篇文章将用来陆续整理makefile编写的时候出现的问题和网上找到的一些答案。
0. gcc的常用规则$ gcc -Wall -c hello_fn.c 产生一个 .o 文件(编译)$ gcc main.o hello_fn.o -o hello 产生可执行文件(链接)如果只有一个文件,可以把编译和链接用一个command完成gcc -Wall hello.c -o hello1. 如何在makefile中echoa) 必须在某一个段内,否则会有( commands commence before first target)b) 命令必须以tab开头,否则会有(missing separator)c) @符号不能丢在某个段内,如clearn里:clean:@echo "hello, baidu" ##这一行开头是个TAB符2. 如何让makefile同时支持32和64位ARCH := $(shell getconf LONG_BIT) # 很巧妙,获取long在不同系统上的位数来决定系统的位数CPP_FLAGS_32 := -D32_BIT ... Some 32 specific compiler flags ... CPP_FLAGS_64 := -D64_BITCPP_FLAGS := $(CPP_FLAGS_$(ARCH)) ... all the other flags ...3. 如何配置使用intel 编译器icc 往往会有20%左右的性能提升,当然要看具体的代码。
icc一个顺带的好处是比较不依赖较高版本的libstdc++,所以如果icc编译软件对intel cpu将会有更好的兼容性。
AS = asCC = iccCPP = icpcF77 = f77F9X = gfortranLD = icpcAR = arRANLIB = ranlibWINDRES = windres4. 关于伪目标 .PHONY 目标伪目标就是告诉makefile,并不需要生成真实的文件(真目标)的意思,只要把这个命令跑完就行了,这个可以预防一些因为本地真实存在一个真目标,而且依赖没有更新,而导致自己被忽略不去执行的问题,比如若本地存在一个clean的文件,那若不显式的说明这个clean 是伪目标,他就会被忽略,不被执行到。