make和makefile的使用,以及寫一個簡單的進度條程序

1.自動化構建-make/makefile

1.1 背景

  • 一個工程文件中的文件不計其數,其按類型、功能、模塊放在若干目錄中,makefile定義了一系列規則來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于過呢更復雜的功能操作。
  • makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make指令,整個工程完全自動編譯
  • make是一個指令,makefile是一個文件,兩個搭配使用完成項目自動化構建

1.2基本使用

#include <stdio.h>
int main()
{printf("hello world\n");return 0;
}

Makefile文件

test:test.cgcc test.c -o test.PHONY:clean
clean:rm -f test
  • 依賴關系:上面的文件test,依賴test.c
  • 依賴方法:gcc test.c -o test 就是對應的依賴方法
  • 項目清理
    1.工程時需要清理的
    2.向clean這種沒有被第一個目標文件直接或間接關聯,那么他后面所對應的命令將不再被自動執行,不過我們可以顯示要make執行即命令“make clean”來清理目標文件
    3.但是一般我們這種clean的目標文件,我們將他設置為偽目標用.PHONY修飾,偽目標的特性是:總是被執行的

1.3 make是如何工作的

test:test.ogcc test.o -o test
test.o:test.cgcc -c test.c -o test.o.PHONY:clean
clean:rm -f *.i *.s *.o test

在這里插入圖片描述

  1. make會在當前目錄下尋找名字為"Makefile"或“makefile”的文件。
  2. 如果找就會找文件中的第一個目標文件。
  3. 如果test文件不存在或是test所依賴的后面的test.o文件的修改時間要比這個test新,那么就會執行后面所定義的命令來生成test這個文件。
  4. 如果test依賴的test.o文件不存在,那么make會在當前文件尋找test.o的依賴性,如果找到則根據規則生成一個test.o文件。
  5. 當然.c文件.h存在于是make會生成test.o文件然后在用.o文件生成目標文件。
  6. 這就是make的依賴性,make會一層一層的去找文件的依賴關系。
  7. 在尋找過程中,如果出現錯入那么make會直接退出,并且報錯。而對于所定義的命令的錯誤或是編譯不成功,make根本不理
  8. make只管文件的依賴性,即在找到依賴關系后,冒號后面的文件還是不在,那么make就不工作了

1.4 適度擴展語法

compling ... test.c to test.o
linking ... test.o to test.exe
[jfs@superg-alicloud test07]$ cat Makefile
BIN=test.exe 			# 定義變量
CC=gcc
#SRC=$(shell ls *.c) 	# 采用shell命令行式,獲取當前所有.c文件名
SRC=$(wildcard *.c) 	# 或者使用wildcard函數,獲取當前所有.c文件名
OBJ=$(SRC:.c=.o) 		# 將SRC的所有同名.c替換成為.o目標文件列表
LFLAGS=-o 				# 鏈接選項
FLAGS=-c 				# 編譯選項
RM=rm -f 				# 引入命令$(BIN):$(OBJ)@$(CC) $(LFLAGS) $@ $^ 	# $@:代表目標文件名。 $^: 代表依賴文件列表@echo "linking ... $^ to $@"%.o:%.c 				# %.c 展開當前錄下所有的.c。 %.o: 同時展開同名.o@$(CC) $(FLAGS) $< 		# %<: 對展開的依賴.c文件,一個一個的交給gcc。@echo "compling ... $< to $@" # @:不回顯命令.PHONY:clean
clean:@$(RM) $(OBJ) $(BIN) 	# $(RM): 替換,用變量內容替換它.PHONY:test
test:@echo $(SRC)@echo $(OBJ)

2.Linux簡單的系統程序-進度條

通過主函數傳遞參數模擬下載過程

myproc.h

#pragma once#include <stdio.h>void download(double total, double current, double speed);

myproc.c

#include "myproc.h"
#include <string.h>
#include <unistd.h>#define NUM 101
#define STYLE '-'
void FlushProcess(double total, double current)
{char buffer[NUM];memset(buffer,0,sizeof(buffer));const char* lable="|/-\\";int len = strlen(lable);static int cnt=0;int num = (int)(current*100/total);int i = 0;for(; i < num; i++){buffer[i]=STYLE;}double rate = current*100/total;printf("[%-100s][%.1f][%c]\r",buffer,rate,lable[cnt%len]);cnt++;fflush(stdout);}
void process_v2(double total, double current, double speed)
{while(current <= total){FlushProcess(total, current);usleep(5000);current += speed;}
}void process_v1()
{char buffer[NUM];memset(buffer,0,sizeof(buffer));const char *lable="|/-\\";int len = strlen(lable);int cnt = 0;while(cnt <= 100){printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]);fflush(stdout);buffer[cnt]=STYLE;cnt++;usleep(50000);}printf("\n");
}void download(double total, double current, double speed)
{//process_v1();process_v2(total, current, speed);printf("\n download %.2fMB\n",current);
}

main.c

#include "myproc.h"double total = 1024.0;
double current = 0.0;
double speed = 1.0;
int main()
{download(total, current, speed);return 0;
}

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

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

相關文章

數據結構中的棧與隊列:原理、實現與應用

前言&#xff1a;棧和隊列是計算機科學中兩種最基礎的線性數據結構&#xff0c;它們的獨特操作規則和廣泛的應用場景使其成為每一位開發者必須掌握的核心知識。本文將通過生活案例、代碼實現和實際應用場景&#xff0c;帶您深入理解這兩種數據結構的精髓。 1.棧&#xff08;Sta…

如何選擇自己喜歡的cms

選擇內容管理系統cms what is cms1.whatcms.org2.IsItWP.com4.Wappalyzer5.https://builtwith.com/6.https://w3techs.com/7. https://www.netcraft.com/8.onewebtool.com如何在不使用 CMS 檢測器的情況下手動檢測 CMS 結論 在開始構建自己的數字足跡之前&#xff0c;大多數人會…

SDC命令詳解:使用all_outputs命令進行查詢

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html all_outputs命令用于創建一個輸出端口對象集合&#xff0c;關于設計對象和集合的更詳細介紹&#xff0c;可以參考下面的博客。 Synopsys&#xff1a;設計對象https://chenzhang.blog.csdn…

vue 中的ref

vue 中的ref vue 中的ref 1. ??ref?? ** 的基本作用** 在 Vue 中&#xff0c;ref 是用來獲取 DOM 元素或者組件實例的一種方式。對于 <el-form> 組件&#xff0c;通過 ref 可以獲取到該表單組件的實例&#xff0c;進而調用表單組件提供的各種方法和訪問其屬性。 …

數據庫版本控制工具--flyway

一. 什么是Flyway Flyway 是一款開源的數據庫遷移工具。它采用簡單直觀的方式管理數據庫變更&#xff0c;通過版本化的遷移腳本確保數據庫結構的一致性和可重復性。無論是開發環境、測試環境還是生產環境&#xff0c;Flyway 都能確保數據庫變更按照預期順序執行&#xff0c;避…

C++使用PoDoFo庫處理PDF文件

&#x1f4da; PoDoFo 簡介 PoDoFo 是一個用 C 編寫的自由開源庫&#xff0c;專用于 讀取、寫入和操作 PDF 文件。它適用于需要程序化處理 PDF 文件的應用程序&#xff0c;比如批量生成、修改、合并、提取元數據、繪圖等。 &#x1f31f; 核心特點 特性說明&#x1f4c4; P…

論文分享? arXiv2025 | TTRL: Test-Time Reinforcement Learning

TTRL: Test-Time Reinforcement Learning TTRL&#xff1a;測試時強化學習 https://github.com/PRIME-RL/TTRL &#x1f4d6;導讀&#xff1a;本篇博客有&#x1f9a5;精讀版、&#x1f407;速讀版及&#x1f914;思考三部分&#xff1b;精讀版是全文的翻譯&#xff0c;篇幅較…

dify插件接入fastmcp示例

文章目錄 1. 使用python完成mcp服務1.1 準備環境&#xff08;python安裝fastmcp&#xff09;1.2 mcp服務端示例代碼1.3 啟動mcp服務端 2. dify接入2.1 安裝MCP SSE和 Agent 策略&#xff08;支持 MCP 工具&#xff09; 插件2.2 dify agent插件配置mcp:2.3 mcp服務配置&#xff…

Linux 挖礦木馬排查命令清單

Linux 挖礦木馬排查命令清單 1. 系統資源使用情況檢查 # 查看CPU、內存使用情況 top -c# 檢查CPU占用最高的進程 ps aux --sort-%cpu# 查找可疑進程名 ps -ef | grep -i miner\|cpu\|GPU\|xmr# 檢查網絡連接情況 lsof -i2. 可疑進程和隱藏進程檢查 # 檢查僵尸進程 ps -ef | …

PyTorch 中如何針對 GPU 和 TPU 使用不同的處理方式

一個簡單的矩陣乘法例子來演示在 PyTorch 中如何針對 GPU 和 TPU 使用不同的處理方式。 這個例子會展示核心的區別在于如何獲取和指定計算設備&#xff0c;以及&#xff08;對于 TPU&#xff09;可能需要額外的庫和同步操作。 示例代碼&#xff1a; import torch import tim…

自主shell命令行解釋器

目標 能處理普通命令能處理內建命令 實現原理 用下面的時間軸來表示時間發生次序。時間從左向右。shell由標識為sh的方塊&#xff0c;它隨著時間從左向右移動。 shell從用戶讀入字符串“ls”。shell建立一個新的進程&#xff0c;然后等待進程中運行ls程序并等待進程結束。 …

如何在sheel中運行Spark

啟動hdfs集群&#xff0c;打開hadoop100:9870&#xff0c;在wcinput目錄下上傳一個包含很多個單詞的文本文件。 啟動之后在spark-shell中寫代碼。 // 讀取文件&#xff0c;得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 將單詞進行切…

【入門】數字走向II

描述 輸入整數N&#xff0c;輸出相應方陣。 輸入描述 一個整數N。&#xff08; 0 < n < 10 ) 輸出描述 一個方陣&#xff0c;每個數字的場寬為3。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int in;i>1;i--){for(…

Python自動化-python基礎(下)

六、帶參數的裝飾器 七、函數生成器 運行結果&#xff1a; 八、通過反射操作對象方法 1.添加和覆蓋對象方法 2.刪除對象方法 通過使用內建函數: delattr() # 刪除 x.a() print("通過反射刪除之后") delattr(x, "a") x.a()3 通過反射判斷對象是否有指定…

重新定義高性能:Hyperlane —— Rust生態中的極速HTTP服務器

重新定義高性能&#xff1a;Hyperlane —— Rust生態中的極速HTTP服務器 &#x1f680; 為什么選擇Hyperlane&#xff1f; 在追求極致性能的Web服務開發領域&#xff0c;Hyperlane 憑借其獨特的Rust基因和架構設計&#xff0c;在最新基準測試中展現出令人驚艷的表現&#xff…

通俗的理解MFC消息機制

1. 消息是什么&#xff1f; 想象你家的門鈴響了&#xff08;比如有人按門鈴、敲門、或者有快遞&#xff09;&#xff0c;這些都是“消息”。 在 MFC 中&#xff0c;消息就是系統或用戶觸發的各種事件&#xff0c;比如鼠標點擊&#xff08;WM_LBUTTONDOWN&#xff09;、鍵盤輸入…

騰訊開源SuperSonic:AI+BI如何重塑制造業數據分析?

目錄 一、四款主流ChatBI產品 二、ChatBI應用案例與實際落地情況 三、SuperSonic底層原理 3.1、Headless?BI 是什么 3.2、S2SQL?是什么 3.3、SuperSonic 平臺架構 四、ChatBI應用細節深挖 五、與現有系統的集成方案 六、部署和安全 七、開源生態、可擴展性與二次開…

AI生成視頻推薦

以下是一些好用的 AI 生成視頻工具&#xff1a; 國內工具 可靈 &#xff1a;支持文本生成視頻、圖片生成視頻&#xff0c;適用于廣告、電影剪輯和短視頻制作&#xff0c;能在 30 秒內生成 6 秒的高清視頻&#xff08;1440p&#xff09;&#xff0c;目前處于免費測試階段。 即…

OrangePi Zero 3學習筆記(Android篇)5 - usbutils編譯(更新lsusb)

目錄 1. Ubuntu中編譯 2. AOSP編譯 3. 去掉原來的配置 3. 打包 4. 驗證lsusb 在Ubuntu中&#xff0c;lsusb的源代碼源自usbutils。而OrangePi Zero 3中lsusb的位置可以看文件H618-Android12-Src/external/toybox/Android.bp&#xff0c; "toys/other/lsusb.c",…

bcm5482 phy 場景總結

1,BCM5482是一款雙端口10/100/1000BASE-T以太網PHY芯片,支持多種速率和雙工模式。其配置主要通過MDIO(Management Data Input/Output)接口進行,MDIO接口用于訪問PHY芯片內部的寄存器,從而配置網絡速率、雙工模式以及其他相關參數。 a,具體以下面兩種場景舉例 2. 寄存器和…