windows下的makefile教程
- 格式:doc
- 大小:56.50 KB
- 文档页数:9
Makefile的编写指导概述什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。
这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。
特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
因为,makefile关系到了整个工程的编译规则。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
可见,makefile都成为了一种在工程方面的编译方法。
现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。
当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。
必竟,这个make是应用最为广泛的,也是用得最多的。
而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。
在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的容,还请各位查看相关的编译器的文档。
makefile中make指令传入的参数Makefile中make指令传入的参数是指在执行make命令时,可以通过命令行传入的参数。
这些参数可以用于控制程序的编译、运行等行为,使得程序更加灵活和可配置。
在Makefile中,我们可以通过在命令行中输入make和参数来执行相应的操作。
参数可以是任意的字符串,可以用于指定编译选项、目标文件、源文件等等。
下面我将结合一些实际的例子,来详细讲解一下如何使用make指令传入的参数。
我们需要在Makefile中定义一些变量,用于存储传入的参数。
可以通过在命令行中使用“变量名=参数值”的方式来传入参数。
例如,我们可以定义一个变量CC,用于存储编译器的路径:```CC = gcc```在命令行中执行make命令时,可以通过“make CC=/usr/local/bin/gcc”来传入参数,将编译器的路径设置为“/usr/local/bin/gcc”。
接下来,我们可以在Makefile中使用这些参数。
例如,我们可以使用$(CC)来表示编译器的路径:```$(CC) -o target source.c```在执行make命令时,make会将$(CC)替换为实际的参数值,然后执行相应的命令。
这样,我们就可以通过命令行传入不同的编译器路径,来编译源文件。
除了编译器的路径,还可以通过命令行传入其他的参数。
例如,我们可以定义一个变量CFLAGS,用于存储编译选项:```CFLAGS = -Wall -O2```在命令行中执行make命令时,可以通过“make CFLAGS=-g”来传入参数,将编译选项设置为“-g”。
然后,我们可以在Makefile中使用这些参数。
例如,我们可以在编译命令中加入$(CFLAGS):```$(CC) $(CFLAGS) -o target source.c```在执行make命令时,make会将$(CFLAGS)替换为实际的参数值,然后执行相应的命令。
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?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变量设置为空。
windows下vscode使⽤cmake的⽅法说在前头:cmake的作⽤,是通过你的CMakeLists⽂件,根据你的⼯程⾃动帮你成makefile⽂件。
优点是CMakeLists⾮常简单好写,makefile写起来则⽐较复杂。
有了makefile⽂件,你就只需要使⽤编译器的make指令,便可以⽣成最终的可执⾏⽂件不同的编译器,所对应的makefile有差异,如mingw的,visual studio的等等,因此使⽤cmake前,应指明它的⽂件⽣成对象是什么,在vscode⾥⾯的⽤户设置⽂件⾥⾯应写上这么⼀⾏:"cmake.generator": "MinGW Makefiles"或者这样:"cmake.preferredGenerators": ["MinGW Makefiles"],还有⼀个坑就是我安装的mingw⾯没有mingw32-make.exe ,然后点击⽣成时,vscode⽼是报错。
开始具体操作需要进⾏⼀下3步:在电脑上安装cmake在电脑上安装mingw在vscode⾥⾯进⾏⼀点配置操作安装cmake安装完成后记得将bin路径添加到系统环境变量,确保在命令⾏中呢个直接搜索使⽤到cmake指令。
安装mingw⾄于每个包代表的意思()如下(建议使⽤x86_64-win32-sjlj):64位系统选择x86_64,32位系统选择i686;Threads设置线程标准可选posix或win32;Exception设置异常处理系统,x86_64可选为seh和sjlj,i686为dwarf和sjlj;安装完成后还是将它的安装路径⾥⾯的bin⽂件夹路径添加到系统环境变量中,确保在命令⾏中能检测得到gcc,g++,mingw32-make在vscode⾥⾯进⾏相关配置安装插件CMake,CMake tools ,C/C++,C++ Intellisense先整好⾃⼰的C++配置⽂件确保语法提⽰什么的都有⼤概如下:"configurations": [{"name": "win64","includePath": ["${workspaceFolder}/**","${workspaceRoot}/Inc/","D:/OpenCV3/build/include"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"windowsSdkVersion": "8.1","compilerPath": "C:/MySolfware/MinGW/bin/g++.exe","cStandard": "c11","cppStandard": "c++17","intelliSenseMode": "gcc-64","configurationProvider": "ms-vscode.cmake-tools"}]主要是设置好那个"includePath"和"compilerPath",根据⾃⼰的mingw路径去设置,其次这⾥要选择win64:然后在设置⾥⾯的cmake configuration 那写好⾃⼰的cmake路径,确保vscode能找到我们的cmake。
usrsctp windows编译usrsctp是一款轻量级的用户空间TCP/IP协议栈,它允许在用户模式下使用TCP/IP协议栈。
在Windows平台上,usrsctp提供了良好的性能和兼容性,使得开发人员能够轻松地使用C或C++语言编写网络应用程序。
本文将介绍如何在Windows系统上编译usrsctp。
一、准备工作在开始编译之前,需要确保已经安装了Windows操作系统,并且已经安装了GCC编译器。
另外,还需要下载并安装usrsctp源代码包和相关的依赖库。
二、配置编译环境1. 打开命令提示符或终端窗口,进入usrsctp源代码目录。
2. 使用以下命令设置编译器和编译器选项:```shellgcc --versioncmake . -DCMAKE_TOOLCHAIN_FILE=../toolchain-windows.cmake ```其中,`../toolchain-windows.cmake`文件需要事先准备好并放置在usrsctp源代码目录中。
该文件包含了编译器和操作系统相关的配置信息。
3. 使用以下命令生成Makefile文件:```shellmake```该命令将根据CMake的配置信息生成Makefile文件,用于后续的编译过程。
三、编译usrsctp1. 使用以下命令编译usrsctp代码:```shellmake usrsctp.exe```该命令将编译usrsctp代码并生成一个可执行文件`usrsctp.exe`。
2. 编译完成后,可以在当前目录下找到生成的`usrsctp.exe`文件。
可以使用该文件进行测试,例如使用以下命令运行一个简单的TCP 服务器示例:```csharp./usrsctp.exe -c 127.0.0.1 -p 6789 -l 127.0.0.1:6890 -a hello_world_server.c -b 10.0.0.2 -e /tmp/log/server.log ```其中,`-c`选项指定了本地IP地址和端口号;`-p`选项指定了远程IP地址和端口号;`-l`选项指定了日志文件的路径;`-a`选项指定了要运行的示例文件的路径;`-b`选项指定了服务器监听的IP地址;`-e`选项指定了日志文件的输出路径。
makefile编译流程Makefile是一种用于自动化编译的工具,它可以根据源代码文件的依赖关系自动编译出目标文件。
Makefile的编写需要遵循一定的规则和语法,下面将介绍Makefile的编译流程。
1. 编写Makefile文件Makefile文件是一个文本文件,其中包含了编译的规则和依赖关系。
在编写Makefile文件时,需要遵循一定的语法规则,如使用TAB键缩进、使用变量和函数等。
2. 执行make命令在Makefile文件所在的目录下执行make命令,make会自动读取Makefile文件,并根据其中的规则和依赖关系进行编译。
如果Makefile文件中没有指定目标,则默认编译第一个目标。
3. 分析依赖关系在执行make命令时,make会先分析Makefile文件中的依赖关系,确定哪些文件需要重新编译。
如果某个源文件被修改了,那么与之相关的目标文件也需要重新编译。
4. 编译源文件在确定需要重新编译的文件后,make会依次编译每个源文件,生成对应的目标文件。
编译过程中,make会根据Makefile文件中的规则和命令进行编译。
5. 链接目标文件在所有的源文件都编译完成后,make会将所有的目标文件链接起来,生成最终的可执行文件。
链接过程中,make会根据Makefile文件中的规则和命令进行链接。
6. 完成编译当所有的源文件都编译完成并链接成功后,make会输出编译成功的信息,并生成最终的可执行文件。
如果编译过程中出现错误,make会输出错误信息并停止编译。
总之,Makefile编译流程是一个自动化的过程,它可以大大提高编译的效率和准确性。
在编写Makefile文件时,需要注意语法规则和依赖关系,以确保编译过程的正确性。
ninja windows 编译Ninja是一个小型的构建系统,用于生成Makefile风格的构建文件。
如果你想在Windows上使用Ninja进行编译,你需要首先安装它,然后配置你的项目以使用Ninja进行构建。
以下是一些步骤,可以帮助你在Windows上使用Ninja进行编译:1. 安装Ninja:你可以从Ninja的官方网站下载预编译的二进制文件。
或者,如果你正在使用Chocolatey(一个Windows的包管理器),你可以运行以下命令来安装Ninja:````choco install ninja````2. 配置你的项目:如果你使用的是CMake,你可以设置`CMAKE_GENERATOR`为`Ninja`。
这将告诉CMake使用Ninja作为构建系统。
对于其他构建系统(如Make或MSBuild),你可能需要查找如何配置它们以使用Ninja。
3. 编译你的项目:使用Ninja进行构建,你可以直接运行Ninja,并指定构建目标(例如,`ninja install`)。
或者,如果你使用的是CMake,你可以直接运行CMake并指定生成Ninja文件(例如,`cmake -G Ninja ..`)。
然后,你可以运行Ninja来构建你的项目。
4. 注意事项:确保你的项目与Ninja兼容。
虽然Ninja支持大多数常见的构建规则,但某些特定的构建逻辑可能需要一些调整。
如果你在Windows上使用C++,你可能还需要配置一个合适的C++编译器。
例如,你可以安装MinGW-w64或MSVC。
5. 查找更多资源:Ninja的官方文档提供了更多关于如何使用和配置它的信息。
在互联网上查找如何在Windows上设置和使用Ninja的其他教程和指南。
希望这些信息能帮助你在Windows上成功地使用Ninja进行编译!。
在Cygwin环境中,`make`命令是一个功能强大的构建工具,它用于自动化执行多个编译步骤,生成可执行文件、库文件等。
使用`make`命令时,需要指定一个包含编译规则的Makefile文件。
Makefile文件定义了编译过程中的各种规则,包括依赖关系、编译选项等。
下面是一个简单的Makefile示例:```makefileCC0 = gccCFLAGS = -Wall -gall: myprogrammyprogram: main.o utility.o$(CC0) $(CFLAGS) -o myprogram main.o utility.omain.o: main.c utility.h$(CC0) $(CFLAGS) -c main.cutility.o: utility.c utility.h$(CC0) $(CFLAGS) -c utility.c```在上面的示例中,`CC0`定义了编译器名称,`CFLAGS`定义了编译选项。
`all`是默认目标,它依赖于`myprogram`目标,并执行构建`myprogram`的命令。
`myprogram`依赖于`main.o`和`utility.o`两个目标,并使用指定的编译器和选项构建它们。
`main.o`和`utility.o`分别依赖于对应的源文件和头文件,并使用指定的编译器和选项进行编译。
要使用这个Makefile进行构建,可以在Cygwin命令行中进入包含Makefile的目录,并输入以下命令:```make```这将根据Makefile中的规则自动执行编译、链接等操作,最终生成可执行文件`myprogram`。
如果要清理生成的文件,可以使用以下命令:```arduinomake clean```这会删除生成的目标文件和可执行文件,以便重新构建。
windows cmake用法CMake是一个跨平台的开源构建系统,它可以用来控制软件编译过程的生成工具。
在Windows操作系统上,CMake可以用于配置和生成用于Visual Studio等集成开发环境的项目文件,以便于进行软件的编译和构建。
在Windows上使用CMake的基本步骤如下:1. 安装CMake,首先需要从CMake官方网站上下载并安装CMake的Windows版本。
安装完成后,可以在命令行中使用cmake命令。
2. 创建CMakeLists.txt文件,在你的项目根目录下创建一个名为CMakeLists.txt的文件,这个文件包含了项目的构建信息和依赖关系。
在这个文件中,你需要指定项目的名称、要求的最低版本号、包含的源文件等信息。
3. 选择生成器:在命令行中使用cd命令切换到项目的根目录,然后使用cmake命令指定生成器。
比如,如果你想要生成Visual Studio项目文件,可以使用类似下面的命令:cmake -G "Visual Studio 16 2019" .这会在当前目录下生成Visual Studio 2019的项目文件。
4. 构建项目,生成项目文件后,可以使用生成的项目文件进行编译和构建。
如果使用的是Visual Studio生成器,可以直接打开生成的.sln文件进行编译和构建。
总的来说,使用CMake在Windows上的基本步骤包括安装CMake、创建CMakeLists.txt文件、选择生成器并生成项目文件、最后使用生成的项目文件进行编译和构建。
希望这些信息能够帮助你更好地理解在Windows上使用CMake的方法。
Make 的使用指南1. 简介Make 是一个程序构建工具,可以自动化编译代码、执行测试和生成发布版本。
Makefile 是 Make 命令所使用的脚本文件,其中包含了构建程序所需的指令和依赖关系。
本文档将介绍 Make 的使用方法以及 Makefile 的编写规则。
2. 安装Make 可以在大多数操作系统中使用,如 Linux、MacOS 和Windows。
在 Linux 和 MacOS 系统中,Make 命令已经自带。
在Windows 系统中,需要安装 Cygwin 或者 MinGW 环境,才干使用Make 命令。
3. 使用 Make使用 Make 可以通过指定 Makefile 来执行一系列指令。
在终端中输入 make 命令即可执行 Makefile 中的指令。
普通来说,Makefile 包括以下几个部份:- 变量:定义一些常量或者命令行参数。
- 目标:指定需要构建的目标程序或者文件。
- 依赖关系:指定目标文件所依赖的源文件或者其他目标文件。
- 命令:指定如何生成目标文件的命令。
下面是一个简单的 Makefile 示例:```CC = gccCFLAGS = -Wall -gLIBS = -lmall: hellohello: hello.o$(CC) $(CFLAGS) $(LIBS) -o hello hello.ohello.o: hello.c$(CC) $(CFLAGS) $(LIBS) -c hello.cclean:rm -f hello.o hello```其中,CC 是编译器的名称,CFLAGS 是编译器参数,LIBS 是需要链接的库。
all、hello 和 hello.o 都是目标文件,分别对应着生成全部文件、生成可执行文件和生成目标文件的命令。
clean 是清除所有生成文件的命令。
使用 make 命令时,可以指定要构建的目标文件名,也可以使用默认的 all 目标,生成全部文件。
makefile编译lib方法在Makefile中编译静态库和动态库,通常需要设置一些变量和规则。
下面是一个简单的例子,展示了如何使用Makefile编译静态库和动态库:```makefile定义库的名称LIB_NAME = test定义静态库和动态库的名称STATIC_NAME = lib$(LIB_NAME).aSHARE_NAME = lib$(LIB_NAME).so编译目标all: $(STATIC_NAME) $(SHARE_NAME)编译静态库$(STATIC_NAME): $(OBJ)ar rcs $(STATIC_NAME) $(OBJ)编译动态库$(SHARE_NAME): $(OBJ)gcc -shared -o $(SHARE_NAME) $(OBJ)编译规则,假设源文件是.c,目标文件是.o%.o: %.cgcc -c $(CFLAGS) $< -o $清理生成的目标文件和库文件clean:rm -f $(OBJ) $(STATIC_NAME) $(SHARE_NAME)```在上面的例子中,首先定义了库的名称(LIB_NAME),然后根据库的名称生成静态库(STATIC_NAME)和动态库(SHARE_NAME)的名称。
接下来,通过all规则指定了所有要生成的目标,即静态库和动态库。
然后,通过$(STATIC_NAME)和$(SHARE_NAME)规则指定了生成静态库和动态库所需的依赖目标(OBJ)。
在依赖目标列表中,我们可以指定多个源文件(.c),并使用Makefile中的自动变量$<和$来引用源文件和目标文件的路径。
最后,通过clean规则指定了清理生成的目标文件和库文件的命令。
在Makefile中,我们还可以使用其他变量和规则来控制编译过程,例如定义编译器选项(CFLAGS)、链接其他依赖库等。
具体的Makefile编写方式可以根据实际需求进行调整。
makefile 运算
在Makefile中,可以使用一些内置的操作符和函数进行一些运算。
下面是一些常用的运算方式:1. 变量运算:- 赋值运算:使用`=` 或`:=` 进行变量赋值。
- 字符串拼接:使用`(var1)(var2)` 进行字符串拼接。
2. 算术运算:- 加法:`(shell expr (var1) + (var2))`,使用`expr`命令进行加法运算。
- 减法:`(shell expr (var1) - (var2))`,使用`expr`命令进行减法运算。
- 乘法:`(shell expr (var1) \* (var2))`,使用`expr`命令进行乘法运算。
- 除法:`(shell expr (var1) / (var2))`,使用`expr`命令进行除法运算。
3. 逻辑运算:- 比较运算:可以使用内置的条件函数`ifeq`、`ifneq`、`ifdef` 和`ifndef` 进行比较运算,返回一个条件判断结果作为变量的值。
- 逻辑运算符:可以使用逻辑运算符`&&` 和` ` 进行逻辑运算。
4. 条件判断:- 条件判断语句:使用`ifeq`、`ifneq`、`ifdef` 和`ifndef` 来进行条件判断。
- 条件赋值:可以使用条件判断来动态赋值变量。
这些是在Makefile中常用的一些运算方式,可以根据具体的需求和场景来选择合适的运算方式。
一、概述CMake 是一个开源的、跨平台的构建系统,用于自动化编译过程。
它能够处理各种不同的编程语言和平台,包括 Windows、Linux、Mac 等。
在 Windows 下使用 CMake 进行编译,需要先安装 CMake 工具,然后按照 CMake 的指示进行操作。
二、安装 CMake要使用 CMake 在 Windows 下进行编译,首先需要安装 CMake。
可以从 CMake 的官方网站下载 CMake,根据提示进行安装。
三、创建 CMakeLists.txt 文件创建一个新的文本文件,并将其命名为 CMakeLists.txt。
这个文件将包含 CMake 的构建指令,用于指示 CMake 如何构建项目。
四、配置项目打开命令提示符或终端,导航到项目文件夹,并输入以下命令来配置项目:```scsscmake .```这将生成一个 CMake 构建脚本,并根据项目设置进行配置。
五、编译项目使用以下命令进行编译:```cmake --build .```这将开始编译过程,并生成可执行文件或库文件。
六、调试和测试在编译完成后,可以运行生成的可执行文件进行测试。
如果在编译过程中遇到任何错误或警告,应进行调试并修复问题。
可以使用 Visual Studio、MSBuild 等工具进行调试,或者手动检查代码中的错误。
七、注意事项在使用 CMake 进行 Windows 编译时,需要注意以下几点:1. 确保安装了正确的编译器和库文件。
CMake 支持多种编译器,如GCC、Clang 等。
需要根据项目需求选择正确的编译器。
2. 在 Windows 下使用 CMake 进行构建时,可能需要手动指定一些路径和库文件。
可以在 CMake 配置时指定这些路径和库文件的位置。
3. 在 Windows 下使用 CMake 进行构建时,需要注意平台的兼容性问题。
不同平台的代码和库可能存在差异,需要根据具体情况进行调整。
makefile 中的语法和bat语法Makefile 是一种用于自动化构建和管理代码的工具,它使用了自己的语法和规则来描述项目的编译和链接过程。
而 BAT (Batch) 是一种用于 Windows 系统的批处理文件,用于执行一系列命令来实现自动化任务。
本文将分别介绍 Makefile 中的语法和 BAT 语法。
一、Makefile 中的语法1. 目标与依赖关系在 Makefile 中,每一条规则包含一个目标和一组依赖。
目标表示要生成的文件,依赖表示生成目标所需要的文件或其他目标。
语法如下:```target: dependency1 dependency2 ...command1command2...```其中,target 和 dependency 可以是文件名或者其他目标名称。
command 表示生成目标的具体操作命令。
2. 变量Makefile 中可以定义变量,用于存储一些常用的值或路径。
语法如下:```VAR_NAME = value```变量的值可以是字符串或者路径等。
在规则中使用变量时,需要在变量前加上 $ 符号,例如:```target: dependencycommand $(VAR_NAME)```3. 函数Makefile 中提供了一些内置函数来处理变量和字符串。
常用的函数有:- $(wildcard pattern): 查找符合 pattern 的文件或目录。
- $(foreach var, list, text): 遍历 list 中的每个元素,将其赋值给 var,并将 text 应用到每个元素上。
- $(shell command): 执行 command 命令,并将标准输出作为函数返回值。
- ...4. 条件判断在 Makefile 中,可以使用条件语句来根据不同的条件执行不同的指令。
常用的条件语句有:- ifeq (arg1, arg2)...else...endif- ifdef var...else...endif- ...二、BAT 语法BAT 文件是包含一系列批处理命令的文本文件,用于在 Windows 系统中执行一系列自动化任务。
windows下的makefile教程 http://blog.csdn.net/mirror_hc/archive/2008/03/26/2221117.aspx joeliu 制作 4/19/2011 22:10:29
1. 先说几句废话
以前看书时经常遇到makefile,nmake这几个名词,然后随之而来的就是一大段莫名其妙的代码,把我看得云里雾里的。在 图书馆和google上搜了半天,也只能找到一些零零星星的资料,把我一直郁闷得不行。最近因缘巧合,被我搞到了一份传说中的MASM6手册,终于揭开了 NMAKE的庐山真面目。想到那些可能正遭受着同样苦难的同志以及那些看到E文就头晕的兄弟,所以就写了这篇文章。假如大家觉得有帮助的话,记得回复一 下,当作鼓励!如果觉得很白痴,也请扔几个鸡蛋.本文是总结加翻译,对于一些关键词以及一些不是很确定的句子,保留了英文原版,然后再在括号里给出自己的 理解以作参考。由于水平有限,加上使用NMAKE的经验尚浅,有不对的地方大家记得要指正唷。MASM6手册在AOGO(好像是)可以download, 在我的BLOG上有到那的链接。
2. 关于NMAKE
Microsoft Program Maintenance Utility,外号NMAKE,顾名思义,是用来管理程序的工具。其实说白了,就是一个解释程序。它处理一种叫做makefile的文件(以mak为后 缀),解释里面的语句并执行相应的指令。我们编写makefile文件,按照规定的语法描述文件之间的依赖关系,以及与该依赖关系相关联的一系列操作。然 后在调用NMAKE时,它会检查所有相关的文件,如果目标文件(target file,下文简称target,即依赖于其它文件的文件)的time stamp(就是文件最后一次被修改的时间,一个32位数,表示距离1980年以来经过的时间,以2秒为单位)小于依赖文件(dependent file,下文简称dependent,即被依赖的文件)的time stamp,NMAKE就执行与该依赖关系相关联的操作。请看下面这个例子: foo.exe : first.obj second.obj link first.obj,second.obj 第一行定义了依赖关系,称为dependency line;第二行给出了与该依赖关系相关联的操作,称为command line。因为foo.exe由first.obj和second.obj连接而成,所以说foo.exe依赖于first.ogj和 second.obj,即foo.exe为target,first.obj和second.obj为dependent。如果first.obj和 second.obj中的任何一个被修改了(其time stamp更大),则调用link.exe,重新连接生成foo.exe。这就是NMAKE的执行逻辑。 综上,NMAKE的核心就是这3个家伙——依赖关系,操作和判定逻辑(target.timestamp < dependent.timestamp,如果为true,就执行相应操作)。
3. MAKEFILE的语法
现在详细讨论一下makefile的语法。makefile就像一个玩具型的程序语言,麻雀虽小,但五脏具全。makefile的组成部分包括:描述语句(description block),推导规则(inference rules),宏和指令(directive)。 描述语句就是dependent lines和command lines的组合;推导规则就是预先定义好的或用户自己定义的依赖关系和关联命令;宏就不用说了吧;指令就是内定的一些可以被NMAKE识别的控制命令,提供了很多有用的 功能。
3.1 特殊符号 另外,makefile中使用以下几个具有特殊意义的符号: ^ # \ ( ) { } ! @ - : ; $ ^(caret):用于关闭某些字符所具有的特殊意义,使其只表示字面上的意义。例如:^#abc表示#abc这个字符串,而#abc则用于在 makefile中加入注释,#在这里为注释标志,就像C++中的//。另外,在一行的末尾加上^,可以使行尾的回车换行符成为字串的一部分。 #(number sign):为注释标志,NMAKE会忽略所有从#开始到下一个换行符之间的所有文本。这里要注意的是:在command lines中不能存在注释。因为对于command lines,NMAKE是将其整行传递给OS的。通常对于command lines的注释都是放在行与行之间。 \(backslash):用于将两行合并为一行。将其放在行尾,NMAKE就会将行尾的回车换行符解释为空格(space)。 %(percent symbol):表示其后的字符串为一文件名。用法较复杂,在讲dependent lines的时候再详细讨论。 !(exclamation symbol):命令修饰符,在下面会有详细的讨论。 @(at sign):命令修饰符,在下面会有详细的讨论。 :(colon):用于dependent lines和inference rules中,用于分隔target和dependent。 ;(semicolon):如果对于一个dependent line只有一条命令,则可以将该命令放在dependent line的后面,二者之间用―;‖分隔。 $(dolor sign):用于调用宏,在下面讲宏的时候再详细讨论。
在makefile中还可以使用DOS通配符(wildcard)来描述文件:* 和 ?。作用相信大家都很熟悉了,在此就不再浪费口水了。 如果要将中间有空格或制表符的字符串作为整体对待,则应该用双引号 ” 将之括起来,例如,在指定一个中间有空格的长文件名的时候: ―My Document‖ 或在定义一个宏的时候: MYMACRO=‖copy a:\foo.exe c:\‖
3.2 描述语句块(Description Blocks) 描述语句块为makefile主体的基本组成单元,其典型结构如下: target : dependents commands block Dependent Line 每一个描述语句块中只有一个dependent line,其定义了一个依赖关系。该行的开头不能有任何空白(空格或制表符)。冒号两边的target和dependent都可以有多个,之间以空格分隔。NMAKE在分析makefile时首先会从头到尾扫描每一个dependent line,然后根据依赖关系建立起一棵依赖关系树(dependent tree)。例如对于依赖关系: foo.exe : first.obj second.obj first.obj : first.cpp second.obj : second.cpp 则在其依赖关系树中,foo.exe为first.obj和second.obj的父亲,而first.obj则是first.cpp的父亲,second.obj是second.cpp的父亲。如果second.cpp被更新了,则second.obj会被重新构造,从而导致 foo.exe被重新构造。NMAKE就是这样由下而上地对整棵树中的结点进行评估的。 虽然makefile中可以有很多的dependent lines,但NMAKE只会构造出现在它的命令行中的targets,或者,如果命令行中没有给出targets,就构造第一个dependent line中的第一个target。其他所有无关的targets都不会被构造。例如: foo1.exe foo2.exe : first.obj first.obj : first.cpp second.obj : second.cpp 假设上面的第一行语句为makefile中出现的第一个dependent line,且命令行中没有给出target。当first.cpp被更新后,first.obj和foo1.exe都会被重新构造,而foo2.exe和second.obj则不会。 当在一个dependent line中出现多个target时,例如: boy.exe girl.exe : first.obj echo Hello 该语句相当于: boy.exe : first.obj echo Hello girl.exe : first.obj echo Hello 注:echo是一条控制台命令,用于在STDOUT上显示一行信息) 同一个target也可以出现在多个dependent lines中。在这种情况下,如果只有一个dependent line后跟有command line,则它们会被合并为一个描述语句块,例如: foo.exe : first.obj echo Building foo.exe… … foo.exe : second.obj NMAKE会将其处理为: foo.exe : first.obj second.obj echo Building foo.exe… 如果每一个dependent line后都有command line,则它们会被作为两个描述语句块处理。 如果在dependent line中使用双冒号(::)来分隔target和dependent,并且同一个target出现在多个描述语句块中,此时,NMAKE将会匹配最合适的语句块,以构造该target。 例如: target.lib :: one.asm two.asm three.asm ML one.asm two.asm three.asm LIB target -+one.obj -+two.obj -+three.obj; target.lib :: four.c five.c CL /c four.c five.c LIB target -+four.obj -+five.obj; Target.lib同时出现在两个描述语句块中,此时,NMAKE在处理该makefile时,将会选择其中一个描述语句块中的命令来执行。如果任何 asm文件被更新了,NMAKE就调用ML重新编译之,然后再调用LIB(但CL以及之后的命令都不会被调用);类似地,如果任何C文件被更新 了,NMAKE就会调用CL。 在通常情况下,target和dependent都是文件名。NMAKE会首先在当前目录下搜索dependent,如果没有找到,就到用户指定的目录下搜索。指定搜索路径的语法如下: {directory1;directory2;…}dependent 搜索路径放在{}之中,如果有多个,就用―;‖分开。注意,在各个语法成分之间是不能