makecmakelists makefilee cmake qmake都是什么,有什么区别

Linux(34)
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object)).它的作用和qt的qmake是相似的。
作者:辉常哥
链接:/question//answer/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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.cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。
13.make是一个简单的通过文件时间戳控制自动过程、处理依赖关系的软件,这个自动过程可以是编译一个项目。
作者:任卫
链接:/question//answer/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
gcc是编译器,其实后还有连接器等
make是另外一个程序,根据makefile的指示,尽可能协调编一个程序套件的编译全过程,一个程序套件可能包好多多源代码,也可能生成若干二进制文件,还可能指示程序套件的安装程序制作和/或安装过程,那make就通过调用编译器连接器还有其他外部工具达成这一系列工作。make不光可以调用gcc编译器,也可以调用javac啊。makefile精力集中于定义工作流水线。
CMake 是另外一个更高层一点的工具,它的输出是makefile等。支持使用更简单的语言描述编译安装过程。支持多个makefile系列、VisualStudio等
下午补充下推荐使用场景:
1 gcc编译器套件:最简单啦,单文件工程比如helloworld直接使用就行了
2 make&makefile : 小中大型工程肯定要用的啦,大型工程的makefile系统不少也都是噩梦般的存在。适用于工具链【较为统一】的工程中,有一定跨平台能力。
3 CMake:若需要更为广泛的支持多编译工具链更广地跨平台且还不想构建复杂的跨平台makefile系统,那CMake确实是个很好的选择,由CMake来先编译出不同平台的makefile工程,而CMakeLists.txt集中声明描述下工程组件的关系即可。
生成(构建)可执行文件
gcc hello.c -ohello
将上面的命令写到一个文件中,这个文件就是Makefile文件,执行make会执行Makefile中的所有命令
cmake是用来生成Makefile文件的工具,生成Makefile文件的工具不止有cmake,还有autotools。Qt环境下还有qmake
作者:知乎用户
链接:/question//answer/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-----------------
1.CMake编译原理
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:
cmake &指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如
make根据生成makefile文件,编译程序。
2.使用Cmake编译程序
我们编写一个关于开平方的C/C++程序项目,即b= sqrt(a),以此理解整个CMake编译的过程。
a.准备程序文件
文件目录结构如下:
├── build
├── CMakeLists.txt
├── include
│&& └── b.h
└── src
├── b.c
└── main.c
头文件b.h,如下所示:
#ifndef B_FILE_HEADER_INC
B_FIEL_HEADER_INC
cal_sqrt(double
头文件b.c,如下所示:
#include &
../include/b.h
cal_sqrt(double
return sqrt(value);
main.c主函数,如下所示:
#include &
../include/b.h
argc, char
input a:%f\n
= cal_sqrt(a);
sqrt result:%f\n
b.编写CMakeLists.txt
接下来编写CMakeLists.txt文件,该文件放在和src,include的同级目录,实际方哪里都可以,只要里面编写的路径能够正确指向就好了。CMakeLists.txt文件,如下所示:
.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.2
.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(test_sqrt)
path,头文件目录
INCLUDE_DIRECTORIES(
.source directory,源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如&
symbol lookup error xxxxx , undefined symbol
SET(TEST_MATH
${DIR_SRCS}
.add executable file
,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
&CMakeLists.txt主要包含以上的7个步骤,具体的意义,请阅读相应的注释。
c.编译和运行程序
准备好了以上的所有材料,接下来,就可以编译了,由于编译中出现许多中间的文件,因此最好新建一个独立的目录build,在该目录下进行编译,编译步骤如下所示:
操作后,在build下生成的目录结构如下:
├── build
│&& ├── CMakeCache.txt
│&& ├── CMakeFiles
│&& │&& ├──
│&& │&& │&& ├── CMakeCCompiler.cmake
│&& │&& │&& ├── CMakeCXXCompiler.cmake
│&& │&& │&& ├── CMakeDetermineCompilerABI_C.bin
│&& │&& │&& ├── CMakeDetermineCompilerABI_CXX.bin
│&& │&& │&& ├── CMakeSystem.cmake
│&& │&& │&& ├── CompilerIdC
│&& │&& │&& │&& ├── a.out
│&& │&& │&& │&& └── CMakeCCompilerId.c
│&& │&& │&& └── CompilerIdCXX
│&& │&& │&&
├── a.out
│&& │&& │&&
└── CMakeCXXCompilerId.
│&& │&& ├── cmake.check_cache
│&& │&& ├── CMakeDirectoryInformation.cmake
│&& │&& ├── CMakeOutput.log
│&& │&& ├── CMakeTmp
│&& │&& ├── feature_tests.bin
│&& │&& ├── feature_tests.c
│&& │&& ├── feature_tests.cxx
│&& │&& ├── Makefile2
│&& │&& ├── Makefile.cmake
│&& │&& ├── progress.marks
│&& │&& ├── TargetDirectories.txt
│&& │&& └── test_sqrt.
├── build.
├── C.includecache
├── cmake_clean.cmake
├── DependInfo.cmake
├── depend.internal
├── depend.
├── flags.
├── link.txt
├── progress.
└── src
├── b.c.o
└── main.c.o
│&& ├── cmake_install.cmake
│&& ├── Makefile
│&& └── test_sqrt
├── CMakeLists.txt
├── include
│&& └── b.h
└── src
├── b.c
└── main.c
注意在build的目录下生成了一个可执行的文件test_sqrt,运行获取结果如下:
/test_sqrt
sqrt result:
3.参考资料
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1481927次
积分:11216
积分:11216
排名:第1467名
原创:166篇
转载:286篇
评论:125条
(26)(20)(9)(3)(9)(4)(3)(1)(2)(1)(2)(4)(1)(2)(5)(5)(31)(22)(21)(8)(20)(24)(31)(22)(19)(1)(10)(13)(34)(7)(8)(6)(8)(15)(22)(9)(23)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'作者:玟清
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
make 是用来执行Makefile的2. Makefile是类unix环境下(比如Linux)的类似于批处理的”脚本”文件。其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖的文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex。3. Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户),于是就有了跨平台项目管理工具cmake4. cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的东西,但更为抽象和友好,比如你可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。也就是说,从同一个抽象规则出发,它为各个编译器定制工程文件。5. cmake是抽象层次更高的项目管理工具,cmake命令执行的CMakeLists.txt文件6. 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下的编译器
作者:辉常哥
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。
当你的程序只有一个源文件时,直接就可以用gcc命令编译它。
但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大
所以出现了make工具make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。
makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。
makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。
这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。
到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。
接着是qmake,qmake是什么,先说一下Qt这个东西。Qt是跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单的说就是C++的第三方库,使用这个库你可以很容易生成windows,Linux,MAC os等等平台的图形界面。现在的Qt还包含了开发各种软件一般需要用到的功能模块(网络,数据库,XML,多线程啊等等),比你直接用C++(只带标准内裤那种)要方便和简单。
你可以用Qt简简单单就实现非常复杂的功能,是因为Qt对C++进行了扩展,你写一行代码,Qt在背后帮你写了几百上千行,而这些多出来的代码就是靠Qt专有的moc编译器(The Meta-Object Compiler)和uic编译器(User Interface Complier)来重新翻译你那一行代码。问题来了,你在进行程序编译前就必须先调用moc和uic对Qt源文件进行预处理,然后再调用编译器进行编译。上面说的那种普通makefile文件是不适用的,它没办法对qt源文件进行预处理。所以qmake就产生了。
qmake工具就是Qt公司制造出来,用来生成Qt 专用makefile文件,这种makefile文件就能自动智能调用moc和uic对源程序进行预处理和编译。qmake当然必须也是跨平台的,跟cmake一样能对应各种平台生成对应makefile文件。
qmake是根据Qt 工程文件(.pro)来生成对应的makefile的。工程文件(.pro)相对来说比较简单,一般工程你都可以自己手写,但是一般都是由Qt的开发环境 Qt Creator自动生成的,你还是只需要按下那个邪恶三角形就完事了。
还没有完,由于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会
方便,我也没试过。
本文已收录于以下专栏:
相关文章推荐
make makefile cmake qmake 都是什么,有什么区别?
出自: /question//answer/
make 是用来执行Makefile的
Makefile是类unix环境下(比如...
转自:/question/
辉常哥1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器...
编译工具make、gmake、cmake、nmake和Dmake的区别
 gamke, make, nmake, dmake, cmake 异同
现有编译工具
下面是中文翻译部分: 
编程人员已经使用CMake和Make很长一段时间了。当你加入一家大公司或者开始在一个具有大量代码的工程上开展工作时,你需要注意所有的构建。你需要看到处跳转的”CMak...
文本程序到可执行文件生成无论在什么平台大致分为以下几个部分:
  1.用编辑器编写源代码,如.c文件。
  2.用编译器编译代码生成目标文件,如.o。
  3.用链接器连接目标代码生成可执行文件...
转自:https://my.oschina.net/xunxun/blog/86781
大家都知道,写程序大体步骤为:
1. 用编辑器编写源代码,如.c文件。
2. 用编译器编译代码生成目标文件...
在Ubuntu14.04下安装caffe,包括make编译以及cmake编译方式,需要说明的是make和cmake编译互不影响,之所以需要cmake编译是因为楼主用Cmakelist.txt管理工程,...
C实战:项目构建Make,Automake,CMake在本系列文章《C实战:强大的程序调试工具GDB》中我们简要学习了流行的调试工具GDB的使用方法。本文继续“C实战”的主题,对同样非常流行的构建工具...
他的最新文章
讲师:姜飞俊
讲师:汪木铃
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)make makefile cmake qmake都是什么,有什么区别? - 知乎609被浏览38367分享邀请回答271 条评论分享收藏感谢收起GCC 和 cmake的关系? - 知乎95被浏览8345分享邀请回答1198 条评论分享收藏感谢收起21 条评论分享收藏感谢收起查看更多回答2014年3月 Linux/Unix社区大版内专家分月排行榜第二2014年1月 扩充话题大版内专家分月排行榜第二
2014年6月 扩充话题大版内专家分月排行榜第三2014年5月 扩充话题大版内专家分月排行榜第三2014年5月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 cmake和makefile 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信