说明

编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程都不一样。

gcc和clang是两个不同的编译器,而make和cmake是搭配编译器来方便用户进行多文件编译而发明的工具。

具体解释

gcc和clang都是编译器。

gcc是GNU Compiler Collection,也称为GNU编译器套件,可以理解为编译器,它可以编译很多种语言:C/C++、FORTRAN、JAVA、OBJC、ADA等。假如我有一个源文件(比如.c文件),我就可以用gcc命令来编译它。

clang也一样,Clang是一个C语言、C++、Objective-C、Objective-C++语言的轻量级编译器。源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。

clang和gcc相比,比gcc编译速度更快一些,而且错误提示更人性化。

但是光有gcc和clang是不行的,如果你的源文件很多,那就需要一个一个去编译,太麻烦工作量巨大。我们平常用的VC++、Visual Studio、Clion这种大型IDE,里面使用的编译器就是gcc或clang。但是我们通常在使用的时候也就只需要按一个按钮就可以实现对程序的编译,这是如何进行的呢?IDE里面已经帮你做了你需要做的一些了。

上图是Clion在编译几个.c文件时候的编译信息,我们可以看到几个信息,Clion使用了cmake工具,以及Clion编译C/C++使用的编译器为AppleClang(就是适配macbook的clang编译器)。

make工具相当于一个智能的批处理工具,本身没有编译和链接的功能,而是用类似于批处理的方式通过调用makefile文件中用户指定的命令来进行编译和链接。而makefile又是什么,就相当于用户将要执行的一系列命令,make根据makefile中的命令对相应的源文件进行编译和链接的

makefile中可能就有类似的一下命令:gcc -o test.c。

makefile文件在github源码安装程序中很常见,你下载了一个源码包,通常在readme中会有这样的一句:

$ make all
$ make install # root required

make all即编译所有,当然这个源码包中必须有makefile文件才行,执行make all这个命令后make会根据makefile中的命令进行编译。当然这个是“别人家”的源码包,这个通常都给你写好了,但是如果你自己要编译很多源文件的时候,也是要自己写吗?

当然不,还是比较麻烦,所以我们需要cmake工具,这样就可以更加方便地生成makefile文件给make用。cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,无需自己根据每个平台的不同特性去修改。而cmake根据什么生成makefile,它需要根据CMakeLists.txt文件(组态档)去生成makefile

下面是一个CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.8)
project(First_Code)
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp test.cpp assignment.cpp)
add_executable(First_Code ${SOURCE_FILES})

CMakeLists.txt文件是谁写的?当然是你自己写,但是如果你在用IDE(比如本文中的例子Clion)。那就不用担心了,上面的一段代码CLion为你自动生成了,好吧,这个也不用自己写。

但是有时候IDE可能会出现某些错误,这个时候就需要你自己去修改相关文件了,而要修改的文件,无非也就本文中介绍的这几种。

总结:

gcc、clang:两个编译器,用于将程序员的编程语言,编译汇编链接成机器语言;

make:在没使用IDE时,make工具相当于一个智能的批处理工具,本身没有编译和链接的功能,而是用类似于批处理的方式通过调用makefile文件中用户指定的命令来进行编译和链接;

makefile:相当于用户将要执行的一系列命令,make根据makefile中的命令对相应的源文件进行编译和链接;

cmake:用于更加方便地生成makefile文件给make用,cmake还有其他功能,如可以跨平台生成对应平台能用的makefile,无需自己根据每个平台的不同特性去修改;

CMakeLists.txt:cmake根据CMakeLists.txt文件(组态档)去生成makefile,CMakeLists.txt可以自己写,写起来比makefile容易很多;我们使用IDE时,会自动生成各种CMakeLists.txt;

原文链接:

编译器gcc、clang、make、cmake辨析 - Oldpan的个人博客​oldpan.me

发布于 2019-04-30

gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习相关推荐

  1. GCC,Clang,make,cmake,makefile,CMakeLists.txt的概念

    gcc和clang gcc和clang是两个不同的编译器 make和cmake make和cmake是搭配编译器来方便用户进行多文件编译而发明的工具 makefile make工具相当于一个智能的批处 ...

  2. Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译

    转自1:https://www.cnblogs.com/cv-pr/p/6206921.html 转自2:https://blog.csdn.net/qqwangfan/article/details ...

  3. Cmake的CMakeLists.txt写法示例

    Cmake的CMakeLists.txt写法示例 目录 示例一:单文件 示例二:多个源文件 示例三:将hello.c生成一个库来调用 示例四:工程分类文件夹编译 示例五:Cmake的install使用 ...

  4. Cmake之CMakeLists.txt

    我们知道makefile是在Linux编译c或者c++代码的时候的一种脚本文件,但是每一个功能都要写一个makefile文件,这样如果这个工程很大,而且相关性比较强的话,makefile的书写就会变得 ...

  5. 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法

    在不同的平台编译的时候,会用到一些系统内置的变量,比如操作系统名称,版本号之类: CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22″,"FreeBSD-5.4-R ...

  6. 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

    新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程. CMakeLists.txt的基本 ...

  7. 多目录cmake工程 CmakeLists.txt编写

    实现类似于vs中工程的CMakeLists.txt的编写.功能为main.cpp调用hello.cpp 的hello()函数,world.cpp的world()函数.使用自动添加多目录下的文件 1.工 ...

  8. cmake,CMakeLists.txt,make,makefile的关系

    cmake的作用:生成makefile的工具.读入源文件之后,自动生成makefile CMakeLists.txt的作用:告诉cmake,如何生成makefile makefile的作用:设置编译规 ...

  9. “cmake 点点”表示在上一级目录(CMakeLists.txt所在目录)编译

    CMake学习(一)_福尔摩斯帅双的博客-CSDN博客 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . ...

最新文章

  1. node 压缩模块速成
  2. 一级计算机基础第四套,《计算机应用基础》第四套考试与答案.doc
  3. Tomcat修改端口、添加域名访问
  4. ServletConfig的详解
  5. 泰山服务器 oracle数据库,泰山之巅对话•Oracle数据库掌门人:领先对手10年?凭什么口气这么大?...
  6. Pytorch采坑记录:每隔num_workers个iteration数据加载速度很慢
  7. pmwiki 安装和基本配置
  8. 翻车事故频发,原来是开发者漏了这一步!
  9. react-native 开发在Android模拟器上运行
  10. VC++ MFC 学习资料
  11. 并发网站压力测试工具
  12. 全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答,相关问题已汇总
  13. Python:罗马数字转整数
  14. 【AI应用】NVIDIA Tesla T4的详情参数
  15. 凑微分公式_高等数学–求积分的一些方法(IV 凑微分法)
  16. 罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因
  17. Python学习记录-实战一、车牌归属地
  18. 华为手机微信聊天记录删除怎么恢复?基于华为电脑助手备份的恢复方法
  19. 网页微信公众平台登录电脑版
  20. 人工智能 知识表示方法:谓词逻辑和语义网络 题目练习

热门文章

  1. CentOS 7 上 Docker 安装
  2. Apache2.4配置ssl
  3. localStorage存、取数组
  4. sorted_一个函数秒杀冒泡排序算法和选择排序
  5. 1566:基础练习 十六进制转八进制
  6. Android RecyclerView嵌套EditView实时更新Item数据
  7. Abp Uow 设计
  8. 使用var声明的变量 和 直接赋值并未声明的变量的区别
  9. 多行字符串的表示方式
  10. commons-fileupload、smartUpload和commons-net-ftp