cmake nmake qmake 的区别联系

article/2025/10/16 14:38:48

👇推荐关注👇

经常记不住这几个概念,都看了几次了还是容易忘,为以后方面查阅,故而从知乎上复制粘贴过来。

1、gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

2、当你的程序只有一个源文件时,直接就可以用gcc命令编译它。

3、但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大

4、所以出现了make工具
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

5、makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。

6、makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

7、makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

8、这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

9、可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

10、到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

11、当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形

12、接着是qmake,qmake是什么,先说一下Qt这个东西。Qt是跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单的说就是C++的第三方库,使用这个库你可以很容易生成windows,Linux,MAC os等等平台的图形界面。现在的Qt还包含了开发各种软件一般需要用到的功能模块(网络,数据库,XML,多线程啊等等),比你直接用C++(只带标准内裤那种)要方便和简单。

13、你可以用Qt简简单单就实现非常复杂的功能,是因为Qt对C++进行了扩展,你写一行代码,Qt在背后帮你写了几百上千行,而这些多出来的代码就是靠Qt专有的moc编译器(The Meta-Object Compiler)和uic编译器(User Interface Complier)来重新翻译你那一行代码。问题来了,你在进行程序编译前就必须先调用moc和uic对Qt源文件进行预处理,然后再调用编译器进行编译。上面说的那种普通makefile文件是不适用的,它没办法对qt源文件进行预处理。所以qmake就产生了。

14、qmake工具就是Qt公司制造出来,用来生成Qt 专用makefile文件,这种makefile文件就能自动智能调用moc和uic对源程序进行预处理和编译。qmake当然必须也是跨平台的,跟cmake一样能对应各种平台生成对应makefile文件。

15、qmake是根据Qt 工程文件(.pro)来生成对应的makefile的。工程文件(.pro)相对来说比较简单,一般工程你都可以自己手写,但是一般都是由Qt的开发环境 Qt Creator自动生成的,你还是只需要按下那个邪恶三角形就完事了。

16、还没有完,由于qmake很简单很好用又支持跨平台,而且是可以独立于它的IDE,所以你也可以用在非Qt工程上面,照样可以生成普通的makefile,只要在pro文件中加入CONFIG -= qt 就可以了。

17、 这样qmake和cmake有什么区别?
不好意思,cmake也是同样支持Qt程序的,cmake也能生成针对qt 程序的那种特殊makefile,
只是cmake的CMakeLists.txt 写起来相对与qmake的pro文件复杂点。
qmake 是为 Qt 量身打造的,使用起来非常方便,但是cmake功能比qmake强大。
一般的Qt工程你就直接使用qmake就可以了,cmake的强大功能一般人是用不到的。
当你的工程非常大的时候,又有qt部分的子工程,又有其他语言的部分子工程,据说用cmake会 方便,我也没试过。

qmake和nmake

2012年04月11日 14:34:09 congwulong 阅读数 3230

<<<<<<<<<<<<<<<<<<<<<<<<qmake是做什么的?
qmake是用来生成makefile的。
makefile是干嘛的?
makefile里记录了工程中的所有文件,编译器编译时根据makefile文件来进行编译。
qmake怎么生成makefile?
它基于项目文件来生成,(.pro文件)项目文件由开发者创建。
如果是在windows下使用VS开发,首先要把qmake的环境变量设置为win32-msvc。
pro文件用来告诉qmake如何生成makefile。如该项目有哪些源文件和头文件,该应用程序的特定配置,比如需要链接的额外的库,
或者一个额外的包含路径,这些都应该放在项目文件中。
 
 
总结:手写makefile文件比较困难而且容易出错,使用qmake,开发者只需要创建一个简单的项目文件,再运行
qmake就可以生成适当的makefile了。
 
<<<<<<<<<<<<<<<<<<<<<<<<nmake是做什么的?
它处理makefile文件,解释里边的语句并执行相应的指令。
调用NMAKE时,它会检查所有相关的文件,如果目标文件的时间戳小于依赖文件的,那nmake就执行该依赖关系相关联的操作。
举例说明:
foo.exe : first.obj  second.obj
link first.obj, second.obj
第一行定义了依赖关系;第二行给出了该依赖关系相关联的操作。
如果first.obj和second.obj任何一个修改了,那就得调用link.exe,重新链接生成foo.exe。
这就是nmake的执行逻辑。
 

<<<<<<<<<<<<<<<<<<<<<<<<makefile的语法
略...

总结:nmake就相当于一个解释程序,makefile是一个编程语言,写的程序(makefile文件)由nmake来解释执行

make-makefile -- cmake nmake qmake的区别联系

2018年04月20日 10:13:10 决战小树林 阅读数 182

一、make 是用来执行Makefile文件的。Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件。其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖的文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex。

二、Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户),于是就有了跨平台项目管理工具cmake。

三、 cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的东西,但更为抽象和友好,比如你可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。也就是说,从同一个抽象规则出发,它为各个编译器定制工程文件。cmake是抽象层次更高的项目管理工具,cmake命令执行的CMakeLists.txt文件。

四、qmake是Qt专用的项目管理工具,对应的工程文件是*.pro,在Linux下面它也会生成Makefile,当然,在命令行下才会需要手动执行qmake,完全可以在qtcreator这个专用的IDE下面打开*.pro文件,使用qmake命令的繁琐细节不用你管了。

总结一下,make用来执行Makefile,cmake用来执行CMakeLists.txt,qmake用来处理*.pro工程文件。Makefile的抽象层次最低,cmake和qmake在Linux等环境下最后还是会生成一个Makefile。cmake和qmake支持跨平台,cmake的做法是生成指定编译器的工程文件,而qmake完全自成体系。nmake一般用于windows系统vs的编译。

cmake\qmake -- 跨平台 -- 生成 MakeFile

nmake -- windows vs -- 生成MakeFile

make -- MakeFile

个人总结,有什么不对的地方还望指正,谢谢!

a2d591144865624618cf200a7d285f1d.jpeg

链接:https://www.zhihu.com/question/27455963/answer/89770919

·················· END ··················

为便于交流,我创建了几个高质量的技术群,里面有很多大佬。

如果你也想加入,可以扫描以下二维码,加我个人微信(iwaleon),邀请入群!

762e648f25519d32c5f1887f3938f6ea.gif


http://chatgpt.dhexx.cn/article/FvGK65bg.shtml

相关文章

VC++NMAKE

目 录 第1章 NMAKE 1 1.1 运行NMAKE 1 1.1.1 NMAKE的实质 2 1.2 描述块 3 1.2.1 定义 3 1.2.2 多个描述块 3 1.2.3 依赖 4 1.2.4 长文件名 4 1.2.5 多目标 4 1.2.6 合并 5 1.3 宏 5 1.3.1 定义、使用 5 1.3.2 作…

WINDOWS CMAKE与NMAKE

什么是cmake 你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MSnmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循着不同的规范和标准&#xff0c;所执行的…

vs 编译nmake工程

以本人电脑为例&#xff1a; 1、将D:\program files\visual studio 2013\VC\bin这个路径添加到系统环境变量的path中 2、打开cmd的控制台命令行界面 输入nmake与cl来测试是否报错 3、编译make文件&#xff1a; cd到源文件所在目录&#xff0c;使用命令nmake /F *.nmake编译m…

nmake 环境变量配置

本农有3年多C/C开发经验,最近面试全部翻车,总结原因是基础知识不过关,于是最近在看C primer 5,配套的源代码编译没通过,原因是nmake需要配置环境变量,总结错误如下 1.找不到nmake命令 解决方法:找到nmake所在路径,我用的是vs2010,C:\Program Files (x86)\Microsoft Visual Stud…

nmake命令(windows下的makefile)

1. 如果已经有vc6的dsp工程&#xff0c;可直接导出nmake脚本文件(.mak) “Project - Export Makefile...” nmake -f nMakeTest.mak CFG"nMakeTest - Win32 Debug" nmake -f nMakeTest.mak CFG"nMakeTest - Win32 Debug" all nmake -f nMakeTest.mak CFG&q…

nmake简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 nmake学习初步 前言一、nmake在哪里&#xff1f;二、Makefile编写1.hello.c实例代码2. Makefile3 扩展 前言 一直使用vs的IDE&#xff0c;最近编译sqlcipher时&#xff0c;发…

第八章 查询和检索:Query DSL

版权声明 本文为Elastic开源社区版权所有,保证独立性和原创性,未获得授权和允许,任何组织和个人不得以任何方式传播或复制或分享。否则必将追究法律责任。 知识内容输出不易,请尊重他人劳动成果。严禁随意传播、复制和盗用他人成果或文章内容用以商业或盈利目的! 1、查询…

mysql-dql(Data QueryLanguage)summary

1.基础查询 DESC 库名//查看库SHOW DATABASES ;//查看当前所在数据库SHOW TABLES;//查看当前库的所有表USE database;//datebase为需要查询的库名SELECT attribute,attribute2 FROM form;//从form中查询attribute,attribute2SELECT * FROM beauty;//查询表中所有属性SELECT DI…

db.query的使用

首先假设有如下表格&#xff0c;表格名称为&#xff1a;"Employees" SQL基本格式如下&#xff1a; [sql] view plain copy print ? select 列名称 from 表名称 最基本SQL语句&#xff0c;就是从表中选取要返回的列数据&#xff0c;不加任何过滤条件。当然如果&qu…

Elasticsearch——Query DSL语法入门

Query DSL入门 官网介绍链接&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html search api就是对存储在elastic search&#xff08;以下简称es&#xff09;中的数据进行查询的相关API&#xff0c;可以类比mysql中的select语句。…

Data Query Language(DQL):数据查询语言

Data Query Language&#xff08;DQL&#xff09;&#xff1a;数据查询语言 基础查询查询所有列查询指定列 条件查询条件查询介绍查询示例如下 模糊查询模糊查询介绍查询示例如下 字段控制查询排序聚合函数分组查询分页查询 建立三张表用于查询&#xff0c;表中数据如下。 stu表…

SpringDataJPA+QueryDSL玩转态动条件/投影查询

在本文之前&#xff0c;本应当专门有一篇博客讲解SpringDataJPA使用自带的SpecificationJpaSpecificationExecutor去说明如何玩条件查询&#xff0c;但是看到新奇、编码更简单易懂的技术总是会让人感到惊喜&#xff0c;而且QueryDSL对SpringDataJPA有着完美的支持。如果你没有使…

ES的Query DSL语句介绍

1、term 过滤 term主要用于精确匹配哪些值&#xff0c;比如数字&#xff0c;日期&#xff0c;布尔值或 not_analyzed 的字符串(未经切词的文本数据类型)&#xff1a; { "term": { "date": "2017-07-01" }} { "term": { "tit…

QueryDSL配置

QueryDSL配置 1&#xff1a;maven配置- <dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId><version>5.0.0</version></dependency><dependency><groupId>com.querydsl</gro…

Elasticsearch:DSL Query

Query DSL的分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有的数据&#xff0c;一般测试用&#xff0c;例如&#xff1a;match_all&#xff0c;但有分页限制&#xff0c;一次20…

SpringBoot+Querydsl 框架,大大简化复杂查询操作

概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍。 查询功能是在各种应用程序里面都有应用&#xff0c;且非常重要的功能。用户直接使用的查询功能往往是在我们做好的UI界面上进行查询&#xff0c;UI会将查询请求发给查询实现的服务器&a…

QueryDSL 关于Q类找不到的问题

先编译代码&#xff0c;如果是在idea中&#xff0c;光标移动到项目上&#xff0c;F4&#xff0c;让后如图操作 回到项目中编码&#xff0c;就可以找到Q类了

JPA 之 QueryDSL-JPA 使用指南

Querydsl-JPA 框架&#xff08;推荐&#xff09; 官网&#xff1a;传送门 参考&#xff1a; JPA整合Querydsl入门篇SpringBoot环境下QueryDSL-JPA的入门及进阶 概述及依赖、插件、生成查询实体 1.Querydsl支持代码自动完成&#xff0c;因为是纯Java API编写查询&#xff0…

使用spring data Querydsl 实现动态查询功能

Table of Contents 概述 定义查询请求 google-like查询 特定字段的类sql查询 使用Spring Data Querydsl 利用Spring Query DSL实现动态查询 实现过程中的难题 主表包含多个子表数据时的AND查询 概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解…

关于 QueryDSL 配置和使用(详细)

关于 QueryDSL 最近写项目&#xff0c;使用到了 Jpa 这个 ORM 规范支持&#xff0c;使用注解的方式实现 Sql &#xff0c;但是用过 Jpa 的同学都知道 Jpa 对于单表操作很灵活&#xff0c;但是对于复杂一些的 SQL 就是很不友好了&#xff0c;所以这个地方我们就用到了 QueryDSL…