转自 https://oldpan.me/archives/gcc-make-cmake-clang-tell
首先说明
编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的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编译器)。
上面是cmake工具对几个源文件进行编译的过程,说道cmake,我们先说make。
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可能会出现某些错误,这个时候就需要你自己去修改相关文件了,而要修改的文件,无非也就本文中介绍的这几种。