gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习
說明
編譯器是翻譯代碼為計(jì)算機(jī)語言的一個(gè)工具,我們平時(shí)寫的代碼如果想在某個(gè)特定的計(jì)算機(jī)上執(zhí)行(計(jì)算機(jī)的cpu構(gòu)架不同),就需要編譯器來對(duì)代碼進(jìn)行編譯匯編鏈接,而匯編和鏈接的過程對(duì)于每個(gè)不同的平臺(tái)上過程都不一樣。
gcc和clang是兩個(gè)不同的編譯器,而make和cmake是搭配編譯器來方便用戶進(jìn)行多文件編譯而發(fā)明的工具。
?
具體解釋
gcc和clang都是編譯器。
gcc是GNU Compiler Collection,也稱為GNU編譯器套件,可以理解為編譯器,它可以編譯很多種語言:C/C++、FORTRAN、JAVA、OBJC、ADA等。假如我有一個(gè)源文件(比如.c文件),我就可以用gcc命令來編譯它。
clang也一樣,Clang是一個(gè)C語言、C++、Objective-C、Objective-C++語言的輕量級(jí)編譯器。源代碼發(fā)布于BSD協(xié)議下。Clang將支持其普通lambda表達(dá)式、返回類型的簡(jiǎn)化處理以及更好的處理constexpr關(guān)鍵字。
clang和gcc相比,比gcc編譯速度更快一些,而且錯(cuò)誤提示更人性化。
但是光有g(shù)cc和clang是不行的,如果你的源文件很多,那就需要一個(gè)一個(gè)去編譯,太麻煩工作量巨大。我們平常用的VC++、Visual Studio、Clion這種大型IDE,里面使用的編譯器就是gcc或clang。但是我們通常在使用的時(shí)候也就只需要按一個(gè)按鈕就可以實(shí)現(xiàn)對(duì)程序的編譯,這是如何進(jìn)行的呢?IDE里面已經(jīng)幫你做了你需要做的一些了。
上圖是Clion在編譯幾個(gè).c文件時(shí)候的編譯信息,我們可以看到幾個(gè)信息,Clion使用了cmake工具,以及Clion編譯C/C++使用的編譯器為AppleClang(就是適配macbook的clang編譯器)。
make工具相當(dāng)于一個(gè)智能的批處理工具,本身沒有編譯和鏈接的功能,而是用類似于批處理的方式通過調(diào)用makefile文件中用戶指定的命令來進(jìn)行編譯和鏈接。而makefile又是什么,就相當(dāng)于用戶將要執(zhí)行的一系列命令,make根據(jù)makefile中的命令對(duì)相應(yīng)的源文件進(jìn)行編譯和鏈接的。
makefile中可能就有類似的一下命令:gcc -o test.c。
makefile文件在github源碼安裝程序中很常見,你下載了一個(gè)源碼包,通常在readme中會(huì)有這樣的一句:
$ make all $ make install # root requiredmake all即編譯所有,當(dāng)然這個(gè)源碼包中必須有makefile文件才行,執(zhí)行make all這個(gè)命令后make會(huì)根據(jù)makefile中的命令進(jìn)行編譯。當(dāng)然這個(gè)是“別人家”的源碼包,這個(gè)通常都給你寫好了,但是如果你自己要編譯很多源文件的時(shí)候,也是要自己寫嗎?
當(dāng)然不,還是比較麻煩,所以我們需要cmake工具,這樣就可以更加方便地生成makefile文件給make用。cmake還有其他功能,就是可以跨平臺(tái)生成對(duì)應(yīng)平臺(tái)能用的makefile,無需自己根據(jù)每個(gè)平臺(tái)的不同特性去修改。而cmake根據(jù)什么生成makefile,它需要根據(jù)CMakeLists.txt文件(組態(tài)檔)去生成makefile。
下面是一個(gè)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文件是誰寫的?當(dāng)然是你自己寫,但是如果你在用IDE(比如本文中的例子Clion)。那就不用擔(dān)心了,上面的一段代碼CLion為你自動(dòng)生成了,好吧,這個(gè)也不用自己寫。
但是有時(shí)候IDE可能會(huì)出現(xiàn)某些錯(cuò)誤,這個(gè)時(shí)候就需要你自己去修改相關(guān)文件了,而要修改的文件,無非也就本文中介紹的這幾種。
?
總結(jié):
gcc、clang:兩個(gè)編譯器,用于將程序員的編程語言,編譯匯編鏈接成機(jī)器語言;
make:在沒使用IDE時(shí),make工具相當(dāng)于一個(gè)智能的批處理工具,本身沒有編譯和鏈接的功能,而是用類似于批處理的方式通過調(diào)用makefile文件中用戶指定的命令來進(jìn)行編譯和鏈接;
makefile:相當(dāng)于用戶將要執(zhí)行的一系列命令,make根據(jù)makefile中的命令對(duì)相應(yīng)的源文件進(jìn)行編譯和鏈接;
cmake:用于更加方便地生成makefile文件給make用,cmake還有其他功能,如可以跨平臺(tái)生成對(duì)應(yīng)平臺(tái)能用的makefile,無需自己根據(jù)每個(gè)平臺(tái)的不同特性去修改;
CMakeLists.txt:cmake根據(jù)CMakeLists.txt文件(組態(tài)檔)去生成makefile,CMakeLists.txt可以自己寫,寫起來比makefile容易很多;我們使用IDE時(shí),會(huì)自動(dòng)生成各種CMakeLists.txt;
?
原文鏈接:
編譯器gcc、clang、make、cmake辨析 - Oldpan的個(gè)人博客?oldpan.me
?
發(fā)布于 2019-04-30
總結(jié)
以上是生活随笔為你收集整理的gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 湖南大学 离散数学 2018年期末考试
- 下一篇: docker安装tomcat8