0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux 下GCC的編譯

科技綠洲 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2023-09-11 15:18 ? 次閱讀

一、Linux 下多文件編譯

在上一篇 Linux 下的 C 編程我們知道了 Linux 下的編譯器為 GCC ,以及如何使用 GCC 進(jìn)行編譯,在文章我們講解 GCC 的編譯,使用的只使用了一個 .c 文件,直接使用

gcc [目標(biāo)文件] -o [想要生產(chǎn)的文件名字]

那在遇到多個 .c 文件的時候如何處理呢?

實際上還是使用上面這條指令,其中的 [目標(biāo)文件] 是可以為多個的。

舉一個簡單的例子,我們寫了三個.c 文件,內(nèi)容如下:

圖片

編譯的方式如下圖:

圖片

這么看起來是不是感覺還算簡單?但是我們可以試想一下,以后做項目的時候,成千上萬個文件,怎么辦?

我們要考慮2個主要問題:

1、 文件數(shù)量多起來了以后如何處理?

2、只修改了單個文件,如何只重新編譯修改過后的單個文件?

我們不可能和上面示例一樣手動使用 gcc 命令輸入文件名的,而且文件多起來了,編譯時間需要很長,使用上面示例的命令,是會把所有的文件都重新編譯,在后面的 linux 學(xué)習(xí)開發(fā)中,項目的編譯時間可比學(xué)習(xí) 51 、STM32 哪些工程的時候多得太多,每次都編譯所有文件這種行為肯定是不可取的。

在 Windows 下面我們有各種集成的 IDE 工具,往往只需要一個按鈕,就可以編譯整個工程,方便快捷,比如我們熟悉的 Keil,我們只需要點擊 IDE 工具欄目的一個按鈕,就可以完成我們想要的操作:

圖片

那么在 Linux 下,我們該如何處理呢?

這就要用到本文主要說明的東西:Make 工具 和 Makefile 。

二、make 工具和 Makefile

首先我們要知道什么是 Make 工具,以及 什么 是 Makefile。

這部分的內(nèi)容時基本概念,類似名詞解釋,大家記住就好,沒有什么特別需要說明的,因為我們的重點在于知道以及學(xué)會他們的使用.

2.1 make 和 Makefile 是什么?

make 工具:

make 本質(zhì)上它是一個程序,是一個編譯工具。我們在后面進(jìn)行程序的時候,都需要使用 make 命令。

使用 make 工具我們可以自動完成編譯工作,而且可以有效的處理我們上面提到的問題:

  1. 多個文件的自動編譯;
  2. 每次執(zhí)行 make 命令,只重新編譯修改后的文件;. 這里提一句,Linux 是如何判斷文件是否有修改:文件的修改時間!就是通過 ls -l 查看的那個時間,make 會根據(jù)依賴關(guān)系,如果發(fā)現(xiàn)依賴的文件修改時間比自己新,那么久會重新編譯一下這個依賴文件)

利用 make 工具可以將大型的開發(fā)項目分解成為多個更易于管理的模塊,可以簡潔明快地理順各個源文件之間紛繁復(fù)雜的相互關(guān)系,大大簡化開發(fā)工作,避免不必要的重新編譯 。

make工具通過一個稱為 Makefile 的文件來完成并自動維護(hù)編譯工作,Makefile文件描述了整個工程的編譯、連接規(guī)則。

Makefile 文件:

Makefile 是一個文件,是一個描述一系列規(guī)則的文件。

Makefile 的 開頭 M 要大寫?。m然有的地方說大小寫都可以,但是保證大寫,是肯定不會有莫名其妙的問題的)。

make 會根據(jù) Makefile 文件的規(guī)則規(guī)則執(zhí)行命令,最后完成編譯輸出 。

在 Makefile 文件中:

  • 定義一系列的規(guī)則來制定源文件編譯后的先后順序
  • 特定的語法規(guī)則、支持函數(shù)定義、函數(shù)調(diào)用
  • 能直接集成操作系統(tǒng)中的命令

這是我們學(xué)習(xí) Linux 的一個重點對象,對于新手來說,至少要做到能夠看得懂,會一定程度的修改 Makefile 。

2.2 通過 STM32 提前熟悉 Makefile

實際上 STM32 的開發(fā),我們也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 開發(fā),不妨使用 GCC 工具鏈開發(fā),這樣也能提前熟悉 Makefile 。

如果是我的粉絲朋友,一定知道現(xiàn)在我做 STM32 都是使用的 gcc 工具鏈,具體可查看文章:

拋棄IDE — 在window下使用VScode搭建ARM開發(fā)環(huán)境

如果想看看簡單的 Makefile ,大家可以寫一個簡單的 STM32 工程,然后在 STM32CubeMX 生成工程的時候選擇 Makefile ,如下圖:

圖片

然后打開工程,就可以看看 ST 工具自動生成的 Makefile 文件了,可以讓自己提前熟悉熟悉 Makefile:

圖片

2.3 GCC 與 make 的關(guān)系/區(qū)別?

經(jīng)常有小伙伴會被 GCC 與 make 工具搞得糊里糊涂,雖然知道怎么用,但是傻傻分不清楚或者是說不明白。

看清楚概念:GCC 是編譯器,make 是一個命令工具。

感覺把概念一說就清楚了啊, GCC 是一個編譯 C語言的編譯器, 而 make 是一個工具,他可以使得編譯工作簡化,只不過我們使用的時候 make 會調(diào)用 GCC 編譯器去完成編譯工作。

在 Makefile 中我們會指定執(zhí)行編譯的編譯器類型,而且會根據(jù)指定的編譯器類型進(jìn)行對應(yīng)的命令操作,如下圖:

圖片

因為我們在 linux 下使用的都是 gcc 編譯器,所以 Makefile 中的會看到我們熟悉的 gcc 的操作命令,我們只不過是利用 make 工具的自動編譯去調(diào)用了 gcc 編譯器 對工程進(jìn)行編譯。

三、一個簡單的 Makefile

上面說過,Makefile 是學(xué)習(xí) Linux 的一個要點之一,對于 Makefile 說明,我會單獨分專欄進(jìn)行說明介紹,那本文我們剛剛接觸,我們寫一個簡單的 Makefile 來編譯文章開頭我們示例的3個文件。

直接先寫一個傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目錄下,我們新建一個 Makefile 文件,如下:

圖片

然后試著使用 make 命令看看效果:

圖片

OK,果然可以 make 直接編譯,但是上面這個 Makefile 是有問題的,因為每次執(zhí)行 make ,會把所有的 .c 文件都重新編譯器一次,實際使用也不可能這么寫。

我們回憶一下上一篇課程的內(nèi)容,一個C 文件要經(jīng)過預(yù)處理、編譯、匯編 和 鏈接才能變成可執(zhí)行文件,由不同的 .c 文件生成到不同的 .o 文件,最終才將所有的 .o 文件鏈接成可執(zhí)行文件。

所以我們可分開進(jìn)行,把每一個 .c 先生成 .o 文件,然后再由 所有的 .o 文件生成 最終的文件,這樣如果單獨修改了某個文件 ,只需要把修改過的 .c 文件重新編譯就行了,所以我們的 Makefile 應(yīng)該這么寫:

圖片

make 的結(jié)果如下:

圖片

這樣寫得好處就是,如果我們只對某一個.c 文件進(jìn)行修改,他只會對修改過的文件進(jìn)行重新編譯,我們可以測試一下,比如我們修改一下 a.c 文件:

圖片

上面這個簡單的 Makefile ,大家是不是已經(jīng)可以感覺到 make 工具的方便快捷了!

結(jié)語

本文向大家介紹了一下 Linux 編程時候使用的 make 工具,如何在沒有 IDE 工具的 Linux 環(huán)境下高效快捷的編譯工程,就靠 make 工具了。

當(dāng)然,我們的重點在于 Makefile,對于 Makefile 的寫法規(guī)則,更多的內(nèi)容我會單獨寫文章說明的。

對于入門的小伙伴來說,也沒有必要一蹴而就,寫好 Makefile 固然重要,但是對于現(xiàn)在一般的應(yīng)用開發(fā)來說,Makefile 要完全自己從頭寫得時候不多,很多時候可以找到一個可用的模板進(jìn)行修改,我們至少要做到可以看懂,可以去修改 Makefile!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11475

    瀏覽量

    213015
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    25268
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    578

    瀏覽量

    25248
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64377
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    676

    瀏覽量

    33818
收藏 0人收藏

    評論

    相關(guān)推薦
    熱點推薦

    Linux編程】如何使用gcc編譯源代碼時輸出map文件?

    Linux編程】如何使用gcc編譯源代碼時輸出map文件?
    的頭像 發(fā)表于 08-15 14:08 ?8858次閱讀
    【<b class='flag-5'>Linux</b>編程】如何使用<b class='flag-5'>gcc</b><b class='flag-5'>編譯</b>源代碼時輸出map文件?

    Linuxgcc編譯過程介紹

    工作中,在Linux環(huán)境,有過量產(chǎn)項目的公司,gcc一般都是已經(jīng)安裝好了的。如果需要安裝,請從官網(wǎng)下載或網(wǎng)上找資源下載
    發(fā)表于 07-14 15:50 ?723次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>gcc</b><b class='flag-5'>編譯</b>過程介紹

    迅為龍芯2K1000開發(fā)板Linuxgcc編譯

    gcc 全稱(gnu compiler collection) 即編譯套件, gcc可以支持多種計算機(jī)體系結(jié)構(gòu), 比如 X86、 ARM 、MIPI .在12.2章節(jié)中我們在ubuntu系統(tǒng)
    發(fā)表于 11-26 09:56

    Linux開發(fā)環(huán)境的Arm gcc交叉編譯介紹

    需要以 Arm 指令集的標(biāo)準(zhǔn)編碼。為了讓這個流程變得簡單,開發(fā)者們?yōu)椴煌男酒_發(fā)了不同的編譯器,比如針對 Arm 平臺的 arm-linux-gcc,針對 mips 平臺
    發(fā)表于 06-02 18:00

    Linux環(huán)境程序編譯

    1.GCC編譯 2.Make簡介 3.常用編譯
    發(fā)表于 04-05 21:26 ?60次下載

    淺談gcc編譯

    3.3 gcc編譯器 GNU CC(簡稱為gcc)是GNU項目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和Object C等語言
    發(fā)表于 10-18 13:48 ?0次下載

    LinuxC/C++編譯gcc使用指南

    1.gcc包含的c/c++編譯gcc,cc與c++,g++ gcc和cc是一樣的,c++和g++是一樣的。一般c程序就用gcc
    發(fā)表于 11-02 10:59 ?0次下載

    Linux上安裝GCC3.4.0編譯器過程

    3.4.0比以前版本更好地支持了C++標(biāo)準(zhǔn)。本文以在Redhat Linux上安裝GCC3.4.0為例,介紹了GCC的安裝過程。 安裝之前,系統(tǒng)中必須要有cc或者gcc
    發(fā)表于 11-02 11:18 ?0次下載

    常見gcc編譯警告整理以及解決方法

     GCC有很多的編譯選項,警告選項;指定頭文件、庫路徑;優(yōu)化選項。本文針整理一GCC的警告選項以及gcc
    發(fā)表于 11-14 11:19 ?2.2w次閱讀

    Linux教程之如何對Linux系統(tǒng)gcc進(jìn)行編程的基本使用教程

    GCC是由GNU之父Stallman所開發(fā)的linux編譯器,GCC最初的全名是GNU C Compiler,之后,隨著
    發(fā)表于 11-02 15:15 ?4次下載

    Linux開發(fā)STM32 使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件

    Linux開發(fā)STM32:使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件
    的頭像 發(fā)表于 02-28 15:08 ?1.2w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>開發(fā)STM32 使用<b class='flag-5'>gcc</b>-arm-none-eabi工具鏈<b class='flag-5'>編譯</b>生成bin、hex文件

    gcc的使用方法以及Linux gcc 的常用選項

    gcc的使用方法 gcc 【選項】文件名 gcc常用選項 gcc -v: 查看gcc編譯器的版本
    的頭像 發(fā)表于 10-22 14:42 ?3406次閱讀

    "Linux使用VSCode,GCC,OpenOCD實現(xiàn)STM32一鍵編譯燒錄調(diào)試(STM32CubeMX篇)"

    Linux使用VSCode開發(fā)STM32開發(fā)工具安裝Visual Studio Code與插件STM32CubeMXOpenOCD燒錄工具gcc-arm-none-eabi編譯
    發(fā)表于 12-06 09:36 ?7次下載
    "<b class='flag-5'>Linux</b><b class='flag-5'>下</b>使用VSCode,<b class='flag-5'>GCC</b>,OpenOCD實現(xiàn)STM32一鍵<b class='flag-5'>編譯</b>燒錄調(diào)試(STM32CubeMX篇)"

    Linux編程】如何使用gcc生成預(yù)編譯文件?

    Linux編程】如何使用gcc生成預(yù)編譯文件?
    的頭像 發(fā)表于 08-31 13:07 ?2205次閱讀
    【<b class='flag-5'>Linux</b>編程】如何使用<b class='flag-5'>gcc</b>生成預(yù)<b class='flag-5'>編譯</b>文件?

    Linux使用gcc編譯程序的語法

    01. 調(diào)試相關(guān)的宏 在Linux使用gcc編譯程序的時候,對于調(diào)試的語句還具有一些特殊的語法。 gcc編譯的過程中,會生成一些宏,可以使用
    的頭像 發(fā)表于 06-22 10:51 ?1010次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品