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.pswp.cn/news/458031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458031.shtml
英文地址,請注明出處:http://en.pswp.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%,到…

每日站立會議05

組員一起討論軟件和關鍵功能的實現,在查詢相關資料、詢問老師、查詢網絡之后,無果。轉載于:https://www.cnblogs.com/zuhaoran/p/5435904.html

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, …

jetty上手

jetty簡介:維基百科 Jetty是一個純粹的基于Java的網頁服務器和Java Servlet容器。盡管網頁服務器通常用來為人們呈現文檔,但是Jetty通常在較大的軟件框架中用于計算機與計算機之間的通信。Jetty支持最新的Java Servlet API(帶JSP的支持&#…

常用公差配合表圖_ER彈簧夾頭配套BT刀柄常用規格型號表

ER彈簧夾頭具有定心精度高,夾緊力均勻的特點,廣泛用于機械類零件的精加工和半精加工,通常與BT刀柄匹配使用。BT刀柄是是機械主軸與刀具和其它附件工具連接件,BT為日本標準(MAS403),現在也是普遍使用的一種標準。傳統刀…

Spatial Transformer Networks(STN)

詳細解讀Spatial Transformer Networks(STN)-一篇文章讓你完全理解STN了_多元思考力-CSDN博客_stn

Linux下python安裝升級詳細步驟 | Python2 升級 Python3

Linux下python升級步驟 Python2 ->Python3 多數情況下,系統自動的Python版本是2.x 或者yum直接安裝的也是2.x 但是,現在多數情況下建議使用3.x 那么如何升級呢? 下面老徐詳細講解升級步驟; 首先下載源tar包 可利用linux自帶下…

華為手機連電腦_手機、電腦無網高速互傳!華為神技逆天

Huawei Share是華為的一項自研多終端傳輸技術,可以在沒有網絡狀態下實現手機與手機、電腦等多終端設備間快速穩定的文件分享,尤其是在辦公場景下,可以極大提升辦公效率。華為表示,未來Huawei Share將應用于更多全場景跨設備無縫分…

【無標題】移動端深度學習開源框架及部署(對比)

移動端深度學習開源框架及部署 - 凌逆戰 - 博客園

Github基本操作的學習與溫習

GitHub是最先進的分布式版本控制工具,下面是我學習中總結的操作流程,僅供參考 -----------------------------------------------------------------------------------------------------------------------------------------------------------------…

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緩存…