Make、Makefile、Cmake、QMake 的区别
本博文的简述or解决问题?
make
makefile
cmake
qmake
都是什么,有什么区别?
查了一下好像是编译用的,既然是编译为什么我们不用g++
、 javac
来编译呢?我猜答案是方便一点,但是具体方便在哪呢,请明示。还有它们之间如果有相似性的话,也帮我比较一下吧,谢谢各位大神。
觉得写的比较好,所以在这里搬运过来了
答一(比较写的好):
作者:辉常哥
链接:https://www.zhihu.com/question/27455963/answer/89770919
来源:知乎
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 Creato
r自动生成的,你还是只需要按下那个邪恶三角形就完事了。
16.还没有完,由于qmake很简单很好用又支持跨平台,而且是可以独立于它的IDE,所以你也可以用在非Qt工程上面,照样可以生成普通的makefile
,只要在pro文件中加入CONFIG -= qt
就可以了。
- 这样
qmake
和cmake
有什么区别?
不好意思,cmake
也是同样支持Qt
程序的,cmake
也能生成针对qt
程序的那种特殊makefile
,
只是cmake
的CMakeLists.txt
写起来相对与qmake
的pro
文件复杂点。
qmake
是为 Qt
量身打造的,使用起来非常方便,但是cmake功能比qmake强大。
一般的Qt
工程你就直接使用qmake
就可以了,cmake
的强大功能一般人是用不到的。
当你的工程非常大的时候,又有qt
部分的子工程,又有其他语言的部分子工程,据说用cmake
会 方便,我也没试过。
答二(图很好):
作者:玟清
链接:https://www.zhihu.com/question/27455963/answer/36722992
来源:知乎
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完全自成体系。
具体使用时,Linux
下,小工程可手动写makefile
,大工程用automake来帮你生成makefile
,要想跨平台,就用cmake
。如果GUI
用了Qt
,也可以用qmake
+ *.pro
来管理工程,这也是跨平台的。当然,cmake
中也有针对Qt
的一些规则,并代替qmake
帮你将qt
相关的命令整理好了。
另外,需要指出的是,make
和cmake
主要命令只有一条,make
用于处理makefile
,cmake用来转译CMakeLists.txt
,而qmake
是一个体系,用于支撑一个编程环境,它还包含除qmake
之外的其它多条命令(比如uic
,rcc
,moc
)。
上个简图,其中cl
表示visual studio
的编译器,gcc
表示linux
下的编译器
参考博文:
因为有着热心网友的无私分享,
make makefile cmake qmake都是什么,有什么区别?
Make、Makefile、Cmake、QMake 的区别的更多相关文章
- make makefile cmake qmake都是什么,有什么区别
原文:https://www.zhihu.com/question/27455963 作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36 ...
- [zz] makefile中=和:=的区别
转载自:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html 在Makefile中我们经常看到 = := ?= +=这几个赋 ...
- gcc、make、makefile、cmake、cmakelists区别
文章来源:见下! 作者:辉常哥链接:https://www.zhihu.com/question/36609459/answer/89743845来源:知乎著作权归作者所有.商业转载请联系作者 ...
- Makefile与shell脚本区别
http://blog.chinaunix.net/uid-20672257-id-3345593.html 在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本 ...
- cmake和make区别
大家都知道,写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时 ...
- makefile 里面 := 和 = 的区别
此文版权属于作者所有,任何人.媒体或者网站转载.借用都必须征得作者本人同意! 参考:What is the colon equals sign ( := ) in makefiles? Makefil ...
- makefile中":=","=","?=","+=" 之间的区别
区别: := 有关位置的等于,值取决于当时位置的值 = 无关位置的等于,值永远等于最后的值 ?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值 '=':无关位置的等于 比如: x = ...
- make,makefile,cmake“暴力编译法”的个人经验或理解。
通常我们在本地编译库(opecv.pcl)等我们喜欢使用make -jN (N代表线程数)这样可以加速编译过程, 但是,这不一定是“线程安全”的,因为当某个线程在编译时,经常其他线程编译依赖本线程的 ...
- makefile中":="和“=”的区别
在makefile中,经常能看到这种赋值方式: MyNumber := 这种方式洋名叫做expansion assignment, 翻译过来叫扩展赋值, 我一般就叫冒号等号.这位同学就问了,那么它和普 ...
- Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake
前言 编译器的主要工作流程: 源码(Source Code)>> 预处理器(Preprocessor)>> 编译器(Compiler)>> 汇编程序(Assembl ...
随机推荐
- 「有问必答」秒杀系统 Go并发编程实践!
有问必答 摘要 本文将介绍如何使用Go语言的并发原语来构建一个简单的高并发秒杀系统. 我们将使用Go语言的原生库和一些常见的技术手段,包括互斥锁.通道.计数器等,来解决并发访问和数据一致性的问题. 本 ...
- 掌握这些,轻松管理BusyBox:如何交叉编译和集成BusyBox
在嵌入式系统中,由于设备的资源限制,需要开发人员寻找一种轻量.小型且使用广泛的工具集.而 BusyBox 就是这样一个在嵌入式系统中非常实用的工具集.本文将介绍如何在 Ubuntu 22.04 平台上 ...
- 【UniApp】-uni-app-扩展组件
前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-内置组件 那么了解完了uni-app-内置组件之后,这篇文章来给大家介绍一下 UniApp 中的扩展组件 首先不管三七二十一,先来新建 ...
- javaAPI操作hbase对表格的增删改查
package org.example; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hb ...
- Oracle密码文件、警告日志文件、跟踪文件
密码文件 oracle用于验证sysdba权限的二进制文件. 警告日志文件 警告日志文件是用来记录oracle数据库系统在运行期间的各种信息: oracle实例打开和关闭.建立表空间.增加数据文件等记 ...
- 安装服务器提示A debugger has been found running in your system. Please, unload it from memory and restart
解决方法:运行msconfig,取消调试模式,重启电脑再安装
- 文心一言 VS 讯飞星火 VS chatgpt (165)-- 算法导论13.1 5题
五.用go语言,证明:在一棵红黑树中,从某结点 x 到其后代叶结点的所有简单路径中,最长的一条至多是最短一条的 2 倍. 文心一言: 首先,我们要理解红黑树的性质.红黑树是一种自平衡的二叉查找树,它满 ...
- navicat连接服务器mysql
navicat连接服务器mysql 第一步:配置防火墙 连接服务器的mysql数据库,我们首先需要在服务器上放行3306端口(MySQL服务对应的端口),进入服务器管理页面防火墙,点击添加规则,放行3 ...
- shell中 << EOF 和 EOF 使用
转载请注明出处: EOF(End of File)在Shell中通常用于指示输入的结束,并在脚本或命令中进行多行输入.它允许用户指定一个特定的分界符来表示输入的结束,通常用于创建临时文件.重定向输入或 ...
- CentOS7 安装Python3.9以上版本时。编译报错,原因是openssl版本低
openssl-1.1.1安装 1.前因 python 导入clickhouse_driver需要import ssl和_ssl,报错 File"/home/oracle/python3/l ...