windows下的makefile教程

合集下载

Makefile编写指导

Makefile编写指导

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指令传入的参数

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中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编写规则 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,linux下编译qt源码(比较简单)

Windows,linux下编译qt源码(比较简单)
4.执行nmake
同样编译qt程Biblioteka 需要更改qt版本,修改路径即可。./configure –prefix /opt/qtstatic –static –release -nomake examples --nomake demos -nomake docs -continue
4.待执行完之后执行make
5.makeinstall
编译qt程序需要在工程中添加该版本的qt库,然后到pro工程文件夹中目录下边的configure文件修改qt的路径为新编译qt版本,之后编译qt程 序。
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
Windows, linux下编译 qt源码(比较简单)
一、linux下静态编译qt源码
1.取到qt源码并解压到文件夹
2.cd到qt目录下
3.使用configure生成makefile
二、Windows下编译qt源码,用vs2010进行的编译
1.取到qt源码并解压到文件夹
2.运行vs2010命令行工具command,cd到qt目录下
3.执行命令configure -platform win32-msvc2010 -debug-and-release -fast -opensource -developer-build -confirm-license -nomake examples -nomake demos -nomake docs -nomake translations -no-openssl -webkit -no-qt3support

windows下vscode使用cmake的方法

windows下vscode使用cmake的方法

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 windows编译

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是一种用于自动化编译的工具,它可以根据源代码文件的依赖关系自动编译出目标文件。

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文件时,需要注意语法规则和依赖关系,以确保编译过程的正确性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 搜索路径放在{}之中,如果有多个,就用―;‖分开。注意,在各个语法成分之间是不能

相关文档
最新文档