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