gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习

说明

编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉在无人驾驶中的应用及分类_机器视觉在智能化生产中的广泛应用

什么是机器视觉?顾名思义,简单来说,机器视觉就是用机器代替人眼来测量和判断。机器视觉系统是指通过机器视觉产品将被摄取目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度、颜色等信息,转…

Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程。在该例程序中,使用"Ctrlc"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被告知: bind: Address already in use 原因在…

work2的code和问题

//常量 package cn.itcast.work2; public class Constant { //constant 常量   public static void main(String[] args) { /* * 字符串常量 用双引号括起来的内容 * 整数常量 所有整数 * 小数常量 所有小数 * 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单…

Linux-(C/C++)生成并使用静态库/动态库

静态库/动态库概要 在Windows下静态库的后缀为:.lib、动态库后缀为:.dll;而在Linux下静态库的后缀为:.a、动态库的后缀为:.so。 那么什么是静态库呢? 首先我们来看看程序编译的大体流程:预处理…

windows下最好的围棋_学围棋能使学习成绩提高吗?

孩子几岁开始学习围棋最合适?当然要4岁开始学围棋。一是因为:4岁是幼儿形状知觉形成的关键期,围棋千变万化的棋形(见文后图)是最有利于促进与锻炼孩子形状知觉的形成。二是因为:人的大脑在3周岁后基本已经发育了60%,到…

C#与C/C++的交互zz

C#与C交互,总体来说可以有两种方法: 利用C/CLI作为代理中间层 利用PInvoke实现直接调用 第一种方法:实现起来比较简单直观,并且可以实现C#调用C所写的类,但是问题是MONO构架不支持C/CLI功能,因此无法实现脱…

curl查看swift状态命令_HTTP 请求与响应包括哪些,如何用Chrome查看 HTTP 请求与响应内容和curl 命令的使用...

1.HTTP的请求和响应其实就是通过电脑上的软件来进行的,客户端请求的内容发送到服务器上,服务器收到请求后就会响应客户端的请求,如图:HTTP请求的内容及格式:请求最多包含四部分,最少包含三部分。&#xff0…

Pytorch的BatchNorm层使用中容易出现的问题

前言 本文主要介绍在pytorch中的Batch Normalization的使用以及在其中容易出现的各种小问题,本来此文应该归属于[1]中的,但是考虑到此文的篇幅可能会比较大,因此独立成篇,希望能够帮助到各位读者。如有谬误,请联系指出…

android 比较靠谱的图片压缩

2019独角兽企业重金招聘Python工程师标准>>> 第一:我们先看下质量压缩方法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, …

常用公差配合表图_ER弹簧夹头配套BT刀柄常用规格型号表

ER弹簧夹头具有定心精度高,夹紧力均匀的特点,广泛用于机械类零件的精加工和半精加工,通常与BT刀柄匹配使用。BT刀柄是是机械主轴与刀具和其它附件工具连接件,BT为日本标准(MAS403),现在也是普遍使用的一种标准。传统刀…

Linux下python安装升级详细步骤 | Python2 升级 Python3

Linux下python升级步骤 Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如何升级呢? 下面老徐详细讲解升级步骤; 首先下载源tar包 可利用linux自带下…

华为手机连电脑_手机、电脑无网高速互传!华为神技逆天

Huawei Share是华为的一项自研多终端传输技术,可以在没有网络状态下实现手机与手机、电脑等多终端设备间快速稳定的文件分享,尤其是在办公场景下,可以极大提升办公效率。华为表示,未来Huawei Share将应用于更多全场景跨设备无缝分…

excel统计行数_值得收藏的6个Excel函数公式(有讲解)

收藏的Excel函数大全公式再多,几天不用也会忘记。怎么才能不忘?你需要了解公式的运行原理。小编今天不再推送一大堆函数公式,而是根据提问最多的问题,精选出6个实用的,然后详细的解释给大家。1、计算两个时间差TEXT(B2…

Studio One正版多少钱 Studio One正版怎么购买

随着版权意识的增强,打击盗版的力度越来越大,现在网络上的盗版资源越来越少,资源少很难找是一方面,另一方面使用盗版软件不仅很多功能不能使用,而且很多盗版软件都被植入各种木马病毒,从而带来各种各样的风…

DNS简述

常见DNS记录SOA:域权威开始NS:权威域名服务器A:主机地址CNAME:别名对应的正规名称MX:邮件传递服务器PTR:域名指针 (用于反向 DNS)查询过程浏览器缓存->hosts->LDNS->LDNS缓存->ISP->ISP缓存…

cuda gpu相关汇总

1.Ubuntu16.04:在anaconda下安装pytorch-gpu 转自:Ubuntu16.04:在anaconda下安装pytorch-gpu_莫等闲996的博客-CSDN博客 1 创建虚拟环境并进入 conda create -n pytorch-gpu python3.6 conda activate pytorch-gpu 2 下载对应的安装包和配件 方法一(推荐)&#…

普通人学python有意义吗_学python难吗

首先,对于初学者来说学习Python是不错的选择,一方面Python语言的语法比较简单易学,另一方面Python的实验环境也比较容易搭建。学习Python需要的时间取决于三方面因素。(推荐学习:Python视频教程)其一是学习者是否具有一定的计算机…

在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

【题外话】 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在其他机器上运行程序,进而需要远程调试功能&#xff0c…

服务器定期监控数据_基础设施硬件监控探索与实践

本文选自 《交易技术前沿》总第三十六期文章(2019年9月)陈靖宇深圳证券交易所 系统运行部Email: jingyuchenszse.cn摘要:为了应对基础设施规模不断上升,数据中心两地三中心带来的运维挑战,深交所结合现有基础设施现状,以通用性、灵…

VS2010问题汇总

问题1:error C3872: "0xa0": 此字符不允许在标识符中使用 error C3872: "0xa0": 此字符不允许在标识符中使用 或者 error C3872: 0xa0: this character is not allowed in an identifier 解法:这是因为直接复制代码的问题。0xa0是…