Makefile的通用模板 + 倒計時小程序(13)

文章目錄

  • Makefile 的通用模板
    • 1. Makefile 的推導原則
    • 2. 設計 Makefile 的通用模板
    • 3. 通用模板代碼(可以直接拿來用)
  • Linux 第一個系統程序-進度條(7-3.00.00)
    • 1. 補充回車與換行
    • 2. 行緩沖區
    • 3. 倒計時小程序

Makefile 的通用模板

1. Makefile 的推導原則

以程序的翻譯作為例子來引出Makefile的推導原則。在Makefile中可以用警號(#)去注釋

code:code.o    gcc code.o -o code     
code.o:code.s    gcc -c code.s -o code.o    
code.s:code.i    gcc -S code.i -o code.s    
code.i:code.c    gcc -E code.c -o code.i    .PHONY:clean    
clean:    rm -rf *.o *.i *.s code 

在這里插入圖片描述

  • make時,code是依賴code.o的,可code.o文件在當前路徑下存在嗎?不存在,就向下去推導。
  • code.o是依賴code.s的,可code.s文件在當前路徑也不存在,又向下推導,最終來到了code.c,發現在當前路徑下存在該文件。
  • 就依次形成了code.i,code.s,code.o,code。所以make會進行依賴關系的推導,直到依賴文件是存在的
  • 這就類似于將依賴方法不斷入棧,推導完畢,出棧執行方法,這就是makefile的推導原則

在這里插入圖片描述


2. 設計 Makefile 的通用模板

  • 通用做法先將該路徑下的所有.c文件全部編譯成.o文件,再與動靜態庫進行鏈接,最終形成可執行程序,并不是直接將所有.c文件一股腦的形成可執行程序
    在這里插入圖片描述

1. 第一代版本,并不具備通用性,只適用于code.c這一個源文件

1 code:code.o
2     gcc code.o -o code 
3 code.o:code.c
4     gcc -c code.c -o code.o
5 
6 .PHONY:clean 
7 clean:
8     rm -rf *.o code #下面的圖片寫錯了

在這里插入圖片描述

2. 第二代版本,用變量的形式去進行替換,但也不是很通用,只適用于編譯一個文件

  1 BIN=code #可執行程序2 SRC=code.c #源文件3 OBJ=code.o4 CC=gcc #編譯器5 RM=rm -rf #刪除命令6 7 # $(變量)->內容,比如:$(BIN)->code 8 # 照著下面改即可9 $(BIN):$(OBJ)10     $(CC) $(OBJ) -o $(BIN)11 $(OBJ):$(SRC)12     $(CC) -c $(SRC) -o $(OBJ)13 14 .PHONY:clean15 clean:16     $(RM) $(BIN) $(OBJ)17 18 #code:code.o19 #   gcc code.o -o code                                                                                         20 #code.o:code.c                       21 #   gcc -c code.c -o code.o22 #                                       23 #.PHONY:clean              24 #clean:       25 #   rm -rf *.o code

在這里插入圖片描述

3. 第三代版本,如果在當前目錄下有一百個或一千個源文件呢?怎么保證你的代碼寫的更加通用呢?

在這里插入圖片描述

  • 既然源文件從一個變成了100個,那賦值給變量也需要進行相應的修改。SRC=code.c$(shell ls *.c),把所有羅列出來的.c文件全部放到SRC里面
  • 如何驗證變量SRC里面放置了100個源文件列表呢?用依賴方法:echo $(SRC),打印到顯示器上
  • 命令前面帶上@符號,可以不用回顯命令執行的過程,只顯示命令執行的結果
    在這里插入圖片描述
  • 想將100個源文件放置到變量SRC也可以:SRC$(wildcard *.c)。這里的wildcard就相當于一個函數,兩種用法是等價的
  • 源文件的變量(SRC)發生改變,則對應的OBJ也要發生變化。OBJ=code.oOBJ=$(SRC:.c=.o),這是Makefile自己的語法,要求將SRC所有的源文件的.c換成.o,再賦值給OBJ,這個對于SRC和源文件是沒有影響的
    在這里插入圖片描述
  • 接著就是依賴關系($(BIN):$(OBJ))+ 依賴方法(gcc $(OBJ) -o $(BIN))。這里的依賴方法還有另外一種寫法:gcc $^ -o $@$^$(OBJ)$@$(BIN)
    在這里插入圖片描述
  • 根據Makefile的推導原則,當前路徑下并沒有.o文件,會向下推導。因此要形成.o文件,依賴關系(%.o:%.c)+ 依賴方法($(CC) -c $<
  • 這里的%符號就是Makefile中的通配符,%.o%.c分別匹配所有的.o.c文件。$<就是把%.c中的文件一個一個的拿出來交給對應的命令,再被gcc一個一個的編譯成同名.o文件
    在這里插入圖片描述
  • 一個依賴關系后面是可以跟多個依賴方法的
    在這里插入圖片描述

3. 通用模板代碼(可以直接拿來用)

BIN=code #可執行程序    
SRC=$(wildcard *.c)    
#SRC=$(shell ls *.c) #源文件列表放到變量SRC中    
OBJ=$(SRC:.c=.o)    
CC=gcc #編譯器    
RM=rm -rf #刪除命令    $(BIN):$(OBJ)    @#gcc $(OBJ) -o $(BIN) 雖然加了警號,但不帶@,也會進行命令回顯    @$(CC) $^ -o $@ #加上@符號不讓命令回顯    @echo "鏈接 $^ 成 $@"    
%.o:%.c    @$(CC) -c $<    @echo "編譯... $< 成 $@"    .PHONY:clean                                              
clean:                                     @$(RM) $(BIN) $(OBJ)    .PHONY:test    
test:                                                                                                              @echo $(BIN)                            @echo $(SRC) #不會讓命令進行回顯    @echo $(QBJ)    

Linux 第一個系統程序-進度條(7-3.00.00)

1. 補充回車與換行

在這里插入圖片描述

回車和換行是兩個動作,回車:先回到開頭,換行:新啟一行

2. 行緩沖區

通過有沒有帶\n的變化來引出行緩沖區的存在

#include<stdio.h>    
#include<unistd.h>    int main()    
{    printf("hello world");    sleep(2);    return 0;    
}           
  • 發現了一個現象:當字符串沒帶\n時,hello world不會立即顯示出來。當帶了\n則會立即顯示出來hello world
  • 程序執行永遠是從上至下依次執行,那肯定是先打印(printfhello world,再去sleep,可結果好像是sleep了再打印?
  • 其實printf這條語句已經執行完了,字符串是被存儲到了緩沖區(在內存處)中,而printf打印是將字符串打印到顯示器上
  • 只不過顯示器的刷新策略是:行刷新(帶上\n,就會將緩沖區的字符串刷新到顯示器上)。不帶\n,要么程序結束時進行刷新,要么手動強制進行刷新
  • 手動強制進行刷新,可以用到函數fflush,它的參數類型是FILE*FILE* stdin(鍵盤)FILE* stdout(顯示器),傳入參數fflush(stdout)可立即刷新
    在這里插入圖片描述
#include<stdio.h>    
#include<unistd.h>    int main()    
{    printf("hello world\n");    sleep(2);    fflush(stdout);    return 0;    
}  

3. 倒計時小程序

  • 光標控制,當向光標所在位置寫入一個字符后,光標會自動地向后移動。那就可以先往光標處打印9,再讓光標回車到開頭顯示8,將這個過程循環往復,直至光標處顯示0
    在這里插入圖片描述
  • 為了解決上面的問題,可以用到回車符(\r),因為顯示器的刷新策略,還得進行手動強制刷新:fflush(stdout)
    在這里插入圖片描述
  • 但是當程序從兩位數開始倒計時(cnt = 10),就會依次打印10,90,80,...。這是因為顯示器它只認字符,比如當你往顯示器打印1234時,并不是打印整數1234,而是一個字符一個字符的打印1,2,3,4
  • 這也是為啥顯示器叫字符設備的緣故,printf("%d\n", 1234)printf打印要對這個整數進行格式化,格式化是將這個整數轉成字符再進行輸出
  • 所以從兩位數倒計時,cnt必須占兩個字符(printf("%2d\r", cnt),只不過格式化輸出定長控制的時候,不足對應的位置默認是右對齊的(空格在左邊),所以2前面得加個負號,就能居左對齊
int main()
{int cnt = 15;while(cnt >= 0){printf("%-2d\r", cnt);fflush(stdout);cnt--;sleep(1);}printf("\n");return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85406.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcGIS】水文分析與流域劃分

【ArcGIS】水文分析與流域劃分 一、基礎數據處理1、下載數據2、拼接DEM數據3、填充洼地4、流向分析5、流量分析6、河網生成&#xff08;柵格計算器&#xff09;7、河網分級8、河流鏈接&#xff08;提取子流域的關鍵&#xff09; 二、多個小流域提取1、捕捉傾瀉點2、集水區&…

【C++】簡單工廠模式/工廠方法模式/抽象工廠模式對比

目錄 一、簡單工廠模式&#xff08;Simple Factory Pattern&#xff09;二、工廠方法模式&#xff08;Factory Method Pattern&#xff09;三、抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;四、三者對比總結五、選擇建議如果這篇文章對你有所幫助&#xff0c…

博圖SCL中CONTINUE語句詳解:高效循環控制案例

博圖SCL中CONTINUE語句詳解&#xff1a;高效循環控制利器 在博圖&#xff08;TIA Portal&#xff09;的SCL&#xff08;結構化控制語言&#xff09;編程中&#xff0c;CONTINUE語句是優化循環流程的強大工具。它允許您**跳過當前循環迭代的剩余代碼&#xff0c;直接進入下一次…

django HttpResponse 加返回碼

在Django框架中&#xff0c;HttpResponse對象是用來構造HTTP響應并將其發送回客戶端的。當你創建一個HttpResponse對象時&#xff0c;你可以指定一個返回碼&#xff08;或狀態碼&#xff09;&#xff0c;這是HTTP響應的一部分&#xff0c;用來表示請求的處理結果。狀態碼是三位…

【俄語圖片文字識別】批量識別俄語圖片文字,識別俄語圖片文字的操作步驟和注意事項

場景&#xff1a;在俄語學習&#xff0c;俄語工作中經常遇到一些文字圖片&#xff0c;如何將韓語圖片文字從圖片上扣下來&#xff0c;我們可以直接復制粘貼&#xff0c;提高我們的工作效率 我們會用到一款小工具&#xff1a; 軟件操作步驟&#xff1a; 第一步、打開軟件 第二…

關于AB PLC的ethernet/IP 通信 c++搭建

1.下載開源的libplctag庫 2.通過Cmake-gui生成工程文件 3.編譯生成對應的Debug 4.配置VS studio 源碼 #include "libplctag.h" #include <cstring> #include <iostream> #include <thread> int main() { plc_tag_set_debug_level(PLCTAG_DEB…

實驗分享|自研局部DIC-GPU算法與開源GPU算法對比實驗

1實驗背景 數字圖像相關法DIC是材料力學領域研究的關鍵技術&#xff0c;其中局部DIC憑借亞像素級精度、全場測量等優勢&#xff0c;成為材料局部變形分析的優選方案。傳統CPU計算難以應對局部DIC數萬個子區并行計算需求&#xff0c;新興GPU算法一定程度提高了計算效率&#xf…

P2066 機器分配

P2066 機器分配 - 洛谷 題目描述 總公司擁有高效設備M臺&#xff0c;準備分給下屬的N個分公司。各分公司若獲得這些設備&#xff0c;可以為國家提供一定的盈利。問&#xff1a;如何分配這M臺設備才能使國家得到的盈利最大&#xff1f;求出最大盈利值。其中M?15&#xff0c;N…

Vue 復制頁面內容

方法 1&#xff1a;使用 document.execCommand(copy) 在用戶觸發的事件中 這種方法適用于用戶觸發的事件&#xff08;如點擊按鈕&#xff09;&#xff0c;因為這是 execCommand(copy) 的唯一允許場景。 <template><button click"copyToClipboard">復制…

暑期前端訓練day1

js——記憶函數 2025-06-19 day1 一、記憶函數Ⅰ&#xff1a; 鏈接&#xff1a;https://leetcode.cn/problems/memoize/?envTypeproblem-list-v2&envIdGR5hbGen (1) 題意&#xff1a;給定一個函數&#xff0c;返回一個記憶版的函數&#xff0c;其中你只會包含三個可能輸…

鴻蒙網絡編程系列54-倉頡版實現Smtp郵件發送客戶端

1. SMTP郵件發送客戶端 在本系列的第4篇文章《鴻蒙網絡編程系列4-實現SMTP郵件發送客戶端》中&#xff0c;基于ArkTS語言在API9環境下使用TCPSocket對象演示了SMTP客戶端的實現&#xff0c;并且通過騰訊郵件服務器執行了實際的郵件發送。不過&#xff0c;在2024年末&#xff0…

【慧游魯博】【12】UI美化·圖標選擇與變換·動態交互·格式定義

文章目錄 圖標設計迭代過程初始版本問題分析優化措施 游覽畫卷美化原因當前效果展示美化步驟(1) 代碼修改結構優化CSS&#xff08;優化樣式&#xff09; (2) 圖標選擇&#xff08;4種方案&#xff09;(3) 交互優化 版本一版本二1. 修改HTML結構2. 新增CSS樣式色彩控制技術性能優…

IMU介紹

IMU(Inertial Measurement Unit,慣性測量單元)是一種基于慣性原理的傳感器,通過測量物體的加速度和角速度來獲取運動狀態信息。以下從技術原理、核心組件、應用場景及關鍵指標等方面展開詳細解析: 一、IMU的技術原理與核心組件 1. 工作原理 慣性力學基礎:利用牛頓第二定…

MOS管和比較器

目錄 前言一、前置器件復習使用1.比較器工作特性2.光電二極管3.紅外出水水龍頭4.溫控風扇工作原理 二、MOS管1.前置1.1 增強型MOS管1.2 耗盡型MOS管1.3 四種1.4 比較 2.基本結構3.導通條件4.開關電路的設計方法5.寄生電容問題6.寄生二極管不能忽略7.Nmos管做電源開關的注意事項…

從代碼學習深度強化學習 - Double DQN PyTorch版

文章目錄 前言理論篇:為什么需要 Double DQN?代碼實現篇:構建一個 Double DQN 智能體2.1 項目設置與輔助函數2.2 環境 (Environment)2.3 DQN 的核心組件2.3.1 Replay Buffer (經驗回放池)2.3.2 Q-Network (Q網絡)2.3.3 The Double DQN Agent (Double DQN 智能體)訓練與結果3…

四非鼠鼠計算機專業的保研分享

四非鼠鼠的計算機專業保研分享 1.前言 鼠鼠的本科學校是一所不怎么出名的四非院校&#xff0c;專業是計算機科學與技術。在寫下這篇文章時&#xff0c;鼠鼠并不是為了炫耀什么&#xff0c;而是想把自己在保研路上的一些踩坑經歷分享出來&#xff0c;尤其是寫給那些和我一樣&a…

【C++詳解】STL-vector使用底層剖析和實現

文章目錄 vector介紹vector和string的區別補充知識initializer_listemplace_back結構化綁定 vector的使用構造析構遍歷修改insertfind流插入/流提取vector\<vector>(楊輝三角) vector模擬實現淺品STL源碼構造函數拷貝構造多參數構造迭代器區間構造n個val初始化swapoperat…

MySql升級安裝、socket 及密碼重置

升級 項目需要使用Mysql8.0, 查看自己的ubuntu22.04上mysql版本為5.7&#xff0c; 使用以下命令自動升級到8.0版本。 sudo apt install Mysqlsock錯誤&#xff1a; Can’t connect to local MySQL server through socket 運行mysql -u -p 報以下錯誤&#xff1a; ERROR 200…

Python網絡爬蟲技術:從入門到實戰

在當今數字化時代&#xff0c;網絡爬蟲技術已經成為數據挖掘和信息收集的重要工具。通過網絡爬蟲&#xff0c;我們可以高效地從互聯網上獲取大量有價值的數據&#xff0c;用于數據分析、市場研究、學術研究等多種場景。本文將帶你從零開始&#xff0c;了解Python網絡爬蟲的基本…

偏微分方程初值問題求解

題目 問題 2. (a) u t + 3 u x ? 2 u y = x ; u t + x u x + y u y = x ; u_t + 3u_x - 2u_y = x; \quad u_t + xu_x + yu_y = x; ut?+3ux??2uy?=x;ut?+xux?+yuy?=x; u t + x u x ? y u y = x ; u t + y u x + x u y = x ; u_t + xu_x - yu_y = x; \quad u_t + yu_…