1. 程式人生 > 實用技巧 >編譯器gcc、clang、make、cmake辨析

編譯器gcc、clang、make、cmake辨析

轉自 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可能會出現某些錯誤,這個時候就需要你自己去修改相關檔案了,而要修改的檔案,無非也就本文中介紹的這幾種。