在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux 下GCC的編譯

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

一、Linux 下多文件編譯

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

gcc [目標文件] -o [想要生產的文件名字]

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

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

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

圖片

編譯的方式如下圖:

圖片

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

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

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

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

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

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

圖片

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

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

二、make 工具和 Makefile

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

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

2.1 make 和 Makefile 是什么?

make 工具:

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

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

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

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

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

Makefile 文件:

Makefile 是一個文件,是一個描述一系列規則的文件。

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

make 會根據 Makefile 文件的規則規則執行命令,最后完成編譯輸出 。

在 Makefile 文件中:

  • 定義一系列的規則來制定源文件編譯后的先后順序
  • 特定的語法規則、支持函數定義、函數調用
  • 能直接集成操作系統中的命令

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

2.2 通過 STM32 提前熟悉 Makefile

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

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

拋棄IDE — 在window下使用VScode搭建ARM開發環境

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

圖片

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

圖片

2.3 GCC 與 make 的關系/區別?

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

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

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

在 Makefile 中我們會指定執行編譯的編譯器類型,而且會根據指定的編譯器類型進行對應的命令操作,如下圖:

圖片

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

三、一個簡單的 Makefile

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

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

圖片

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

圖片

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

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

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

圖片

make 的結果如下:

圖片

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

圖片

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

結語

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

當然,我們的重點在于 Makefile,對于 Makefile 的寫法規則,更多的內容我會單獨寫文章說明的。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11326

    瀏覽量

    209961
  • GCC
    GCC
    +關注

    關注

    0

    文章

    107

    瀏覽量

    24857
  • 文件
    +關注

    關注

    1

    文章

    569

    瀏覽量

    24775
  • 函數
    +關注

    關注

    3

    文章

    4341

    瀏覽量

    62799
  • 編譯
    +關注

    關注

    0

    文章

    660

    瀏覽量

    32926
收藏 人收藏

    評論

    相關推薦

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

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

    Linuxgcc編譯過程介紹

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

    迅為龍芯2K1000開發板Linuxgcc編譯

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

    Linux開發環境的Arm gcc交叉編譯介紹

    需要以 Arm 指令集的標準編碼。為了讓這個流程變得簡單,開發者們為不同的芯片開發了不同的編譯器,比如針對 Arm 平臺的 arm-linux-gcc,針對 mips 平臺
    發表于 06-02 18:00

    Linux環境程序編譯

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

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

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

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

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

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

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

    Linux教程之如何對Linux系統gcc進行編程的基本使用教程

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

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

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

    Linux系統Gcc的基本用法和選項

    在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數
    發表于 08-20 09:57 ?1284次閱讀

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

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

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

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

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

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

    Linux使用gcc編譯程序的語法

    01. 調試相關的宏 在Linux使用gcc編譯程序的時候,對于調試的語句還具有一些特殊的語法。 gcc編譯的過程中,會生成一些宏,可以使用
    的頭像 發表于 06-22 10:51 ?724次閱讀
    主站蜘蛛池模板: 日韩高清一级| 日韩午夜大片| 色综合久久网女同蕾丝边| 68日本xxxxxxxxx777| 丁香六月激情综合| 3344成年在线视频免费播放男男| 欧美操穴| 轻点灬大ji巴太大太深了| 女同性大尺度床戏视频| xxx久久| 亚洲人成a在线网站| 国产成人久视频免费| 国产亚洲欧洲人人网| chinese国产videoxx实拍| 午夜爽| 免费一级片在线观看| 5278欧美一区| 热re久久精品国产99热| 亚洲已满18点击进入在线观看| 婷婷激情五月综合| 2021国产成人精品国产| 亚洲免费色| 日本大黄视频| 五月天激情综合网| 日韩视频 中文字幕 视频一区| 美日毛片| 在线免费观看一级片| 久久久久久久久久久观看| zsvdy午夜片| 怡红院日本| 欧美在线小视频| 丁香九月婷婷| 免费人成在线观看视频播放| 午夜黄色网| 伊人久久大| 美女视频黄视大全视频免费网址| 99成人在线观看| 国产精品天天在线| 美女扒开尿口给男的桶个爽| 男女交黄| 色多多视频官网|