Linux自動(dòng)化構(gòu)建工具make/Makefile和git使用及說(shuō)明
Linux項(xiàng)目自動(dòng)化構(gòu)建工具-make/Makefile
make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具,make是一條命令,makefile是一個(gè)文件,兩個(gè)搭配使用,完成項(xiàng)目自動(dòng)化構(gòu)建。
舉例



依賴文件列表以空格進(jìn)行分割,依賴文件列表可以為空,如上方的clean。上方直接使用make,為什么會(huì)執(zhí)行第一對(duì)依賴關(guān)系呢?因?yàn)槿绻鹠ake后面什么都不跟,就會(huì)默認(rèn)執(zhí)行第一對(duì)依賴關(guān)系。make是從上往下執(zhí)行的。
.PHONY

格式: .PHONY:XXX 作用:修飾后XXX對(duì)應(yīng)的方法總是要被執(zhí)行的。
上方make使用一次后就不能繼續(xù)使用了,是因?yàn)榇藭r(shí)生成的可執(zhí)行程序已經(jīng)是最新的了,不需要更新。如果這里的目標(biāo)文件也被,PHONY修飾,也可以一直執(zhí)行。
這里的更新實(shí)際是對(duì)比可執(zhí)行文件和源文件的各自的最近修改時(shí)間,如果可執(zhí)行文件最新,就不會(huì)編譯,如果源文件最新,就會(huì)重新編譯(即新舊時(shí)間的對(duì)比)。

常見符號(hào)

$@是指取目標(biāo)文件,$^是指取依賴文件列表。$的作用是取符號(hào)的內(nèi)容。

vim里面也可以定義變量的。直接用=號(hào),兩邊不要空格 。這里的定義變量就相當(dāng)于c語(yǔ)言里的宏一樣,可以進(jìn)行替換。

@符號(hào)的作用:在外面執(zhí)行指令時(shí),不會(huì)打印出依賴方法 。


一對(duì)依賴關(guān)系不止只有一個(gè)依賴方法。如上圖,還可以發(fā)現(xiàn),echo打印的語(yǔ)句里面$(src)也會(huì)被進(jìn)行替換。
依賴關(guān)系實(shí)例


在makefile里面,注釋是用 #。 make指令原本只會(huì)執(zhí)行第一對(duì)依賴關(guān)系,但是上面例子卻把后面的幾對(duì)依賴關(guān)系都執(zhí)行了。
原理:
- make會(huì)在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它會(huì)找文件中的第一個(gè)目標(biāo)文件,并把這個(gè)文件作為最終的目標(biāo)文件。
- 如果該文件不存在,他就會(huì)執(zhí)行后面所定義的命令來(lái)生成這個(gè)文件。
- 如果所依賴的code.o文件不存在,那么make會(huì)在當(dāng)前文件中找目標(biāo)為code.o文件的依賴性,如果找到則再根據(jù)那一個(gè)規(guī)則生成code.o文件。(這有點(diǎn)像一個(gè)堆棧的過(guò)程)
- 然后再用 code.o 文件聲明 make的終極任務(wù),也就是執(zhí)行文件cod.exe了。
- make會(huì)一層又一層地去找文件的依賴關(guān)系,直到最終編譯出第一個(gè)目標(biāo)文件。
- 在找尋的過(guò)程中,如果出現(xiàn)錯(cuò)誤,比如最后被依賴的文件找不到,那么make就會(huì)直接退出,并報(bào)錯(cuò), 而對(duì)于所定義的命令的錯(cuò)誤,或是編譯不成功,make根本不理。
上面除了第一對(duì)依賴關(guān)系不能改變位置,因?yàn)樗墙K極任務(wù),后面幾對(duì)依賴關(guān)系的順序可以隨便換。
Linux第一個(gè)小程序-進(jìn)度條
緩沖區(qū)

運(yùn)行可執(zhí)行程序后,發(fā)現(xiàn)打印完成后,會(huì)停留3秒然后才顯示下一個(gè)命令行。


當(dāng)我們把’\n"去掉后,發(fā)現(xiàn)運(yùn)行時(shí),會(huì)先停留3秒,然后才會(huì)打印。 這是因?yàn)榇藭r(shí)要打印的內(nèi)容都在緩沖區(qū)里面。程序結(jié)束的時(shí)候,一般會(huì)自動(dòng)沖刷緩沖區(qū)。


如果把"\n"放到中間,就會(huì)先打印包括\n的前面的內(nèi)容,休眠3秒后再打印后面的內(nèi)容。
沖刷緩沖區(qū)有三種方法:
- \n
- 緩沖區(qū)滿了
- 強(qiáng)制刷新:fflush


stdout就是顯示器的意思。緩沖區(qū)是以行刷新的,如果不想換行,就可以用fflush刷新。


上面是打印倒計(jì)時(shí)的程序,不過(guò)在運(yùn)行時(shí),為什么不會(huì)進(jìn)行打印呢?因?yàn)閈r會(huì)讓光標(biāo)回到行首,光標(biāo)指的地方,內(nèi)容就被覆蓋了,下圖是在VS中測(cè)試的結(jié)果,此時(shí)光標(biāo)在3的位置,3就被覆蓋了,無(wú)法打印出來(lái)。


我們只需要fflush強(qiáng)制沖刷緩沖區(qū)就可以解決了。


如果我們把倒計(jì)時(shí)從10開始,會(huì)發(fā)現(xiàn)打印時(shí)后面會(huì)多一個(gè)0。因?yàn)槲覀兇蛴r(shí),打印的是字符,光標(biāo)沒(méi)有移動(dòng)到后面,就不會(huì)把10后面的0覆蓋掉。只需要在%后面加上-2即可,如下圖:

進(jìn)度條版本1(直接顯示)



版本2(下載場(chǎng)景)
Main.c
#include "Processbar.h"
double bandwidth=1024*1024*1.0;
//donwload
void download(double filesize,callback_t cb)
{
double current=0.0;
printf("download begin,current:%lf\n",current);
while(current<=filesize)
{
cb(filesize,current);
current+=bandwidth;
usleep(10000);
}
printf("\ndownload done,filesize:%lf\n",filesize);
}
int main()
{
download(100*1024*1024,Procbar);
download(20*1024*1024,Procbar);
download(3*1024*1024,Procbar);
download(125*1024*1024,Procbar);
//Procbar(100.0,46.2);
//Procbar(100.0,77.8);
//Procbar(100.0,99.9);
// Procbar();
// ForTest();
return 0;
}Processbar.c
#include "Processbar.h"
#include<string.h>
#include<unistd.h>
#define Length 101
#define Style '#'
const char* label="|/-\\";
//version1
//void Procbar()
//{
// char bar[Length];
// memset(bar,'\0',sizeof(bar));
// int len=strlen(label);
//
// int cnt=0;
// while(cnt<=100)
// {
// printf("[%-100s][%3d%%][%c]\r",bar,cnt,label[cnt%len]);
// fflush(stdout);
// bar[cnt++]=Style;
// usleep(20000);
// }
// printf("\n");
//}
//version 2
void Procbar(double total,double current)
{
char bar[Length];
memset(bar,'\0',sizeof(bar));
int len=strlen(label);
int cnt=0;
double rate=(current*100.0)/total;
int loop_count=(int)rate;
while(cnt<=loop_count)
{
bar[cnt++]=Style;
// usleep(20000);
}
printf("[%-100s][%.1lf%%][%c]\r",bar,rate,label[cnt%len]);
fflush(stdout);
}
//void ForTest()
//{
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
// printf("This is for test\n");
//}
Processbar.h
#pragma once #include <stdio.h> typedef void(*callback_t)(double,double); void Procbar(double total,double current); //void Procbar(); //extern void ForTest();



頭文件中typedef了一個(gè)函數(shù),Main.c文件的download函數(shù)有一個(gè)函數(shù)參數(shù)。原因:如果后期需要圖形化界面,傳參傳別的函數(shù)就可以了,不需要改變現(xiàn)在的函數(shù)。
運(yùn)行結(jié)果圖:

使用 git 命令行
安裝 git
sudo yum install -y git
使用 Gitee 創(chuàng)建項(xiàng)目
git是一個(gè)工具,gitee、github就是為這個(gè)工具搭建的網(wǎng)站,即可視化。

初始化,語(yǔ)言選擇你自己的語(yǔ)言。,模板勾選第一個(gè)就行 ,readme就是這個(gè)倉(cāng)庫(kù)簡(jiǎn)單的說(shuō)明,創(chuàng)建后會(huì)自動(dòng)生成中文和英文的說(shuō)明。分支選擇單分支就行。


創(chuàng)建完倉(cāng)庫(kù)后,還需要在本地進(jìn)行配置,復(fù)制粘貼即可。
拉取
復(fù)制然后粘貼,這時(shí)就把遠(yuǎn)程倉(cāng)庫(kù),拉取下來(lái)了。我們還能.git隱藏文件,它就是我們的工作目錄,我們不能去修改它,不然就很容易出錯(cuò)。
本地傳到遠(yuǎn)程

我們想把要上傳的內(nèi)容cp到本地,然后git status查看本地和遠(yuǎn)端倉(cāng)庫(kù)的狀態(tài),這里顯示process是沒(méi)有被添加到本地倉(cāng)庫(kù)的。

使用git add 后面可以是文件名,也可以是 . ,.就是把當(dāng)前位置的所有文件都添加到本地倉(cāng)庫(kù)。

-m 后面跟的是本次提交的日志,必須要寫,不能省略。 此步驟是把內(nèi)容提交到本地倉(cāng)庫(kù)中,跟遠(yuǎn)端沒(méi)有關(guān)系。



最后一步,git push 后,輸入用戶名和密碼即可完成同步。這時(shí)就可以看到已經(jīng)上傳完畢了。
過(guò)程解釋

.git目錄也就是git的本地倉(cāng)庫(kù),add會(huì)把上傳的內(nèi)容中,有變化的部分放到一個(gè)暫存區(qū)。

commit會(huì)把暫存區(qū)里的內(nèi)容真正上傳到本地倉(cāng)庫(kù),并清空暫存區(qū)。最后push就是把本地倉(cāng)庫(kù)跟遠(yuǎn)端進(jìn)行同步。
修改內(nèi)容



修改后,還是按照流程add、commit、push操作即可。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux如何將某個(gè)文件夾移動(dòng)到另一個(gè)文件夾下
這篇文章主要介紹了linux如何將某個(gè)文件夾移動(dòng)到另一個(gè)文件夾下問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用
這篇文章主要介紹了三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用,感興趣的朋友可以參考一下2016-01-01
ROS控制Turtlebot3移動(dòng)機(jī)器人的基礎(chǔ)教程
這篇文章主要給大家介紹了關(guān)于ROS控制Turtlebot3移動(dòng)機(jī)器人的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
ubuntu18.04獲取root權(quán)限并用root用戶登錄的實(shí)現(xiàn)
這篇文章主要介紹了ubuntu18.04獲取root權(quán)限并用root用戶登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Linux使用partprobe更新分區(qū)表的示例代碼
partprobe 是一個(gè)用于在 Linux 操作系統(tǒng)中通知內(nèi)核分區(qū)表變化的命令,它請(qǐng)求操作系統(tǒng)重新讀取磁盤的分區(qū)表,以便及時(shí)反映對(duì)分區(qū)所做的修改,本文給大家介紹了Linux使用partprobe更新分區(qū)表的方法,需要的朋友可以參考下2025-03-03
Linux查詢服務(wù)器系統(tǒng)版本號(hào)的多種方法
在 Linux 系統(tǒng)管理和維護(hù)工作中,了解當(dāng)前操作系統(tǒng)的版本信息是最基礎(chǔ)也是最重要的操作之一,系統(tǒng)版本不僅關(guān)系到軟件兼容性、安全更新策略,還直接影響到故障排查和技術(shù)支持的效率,本文給大家介紹了Linux查詢服務(wù)器系統(tǒng)版本號(hào)的多種方法,需要的朋友可以參考下2025-08-08

