最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux自動(dòng)化構(gòu)建工具make/Makefile和git使用及說(shuō)明

 更新時(shí)間:2025年09月22日 09:16:32   作者:秦jh_  
本文介紹Linux下的make工具與Makefile自動(dòng)化構(gòu)建、緩沖區(qū)刷新及git版本控制操作,涵蓋依賴關(guān)系處理、PHONY修飾、提交流程等關(guān)鍵點(diǎn)

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í)行了。

原理:

  1. make會(huì)在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它會(huì)找文件中的第一個(gè)目標(biāo)文件,并把這個(gè)文件作為最終的目標(biāo)文件。
  3. 如果該文件不存在,他就會(huì)執(zhí)行后面所定義的命令來(lái)生成這個(gè)文件。
  4. 如果所依賴的code.o文件不存在,那么make會(huì)在當(dāng)前文件中找目標(biāo)為code.o文件的依賴性,如果找到則再根據(jù)那一個(gè)規(guī)則生成code.o文件。(這有點(diǎn)像一個(gè)堆棧的過(guò)程)
  5. 然后再用 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ū)有三種方法:

  1. \n
  2. 緩沖區(qū)滿了
  3. 強(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è)文件夾下

    這篇文章主要介紹了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)用

    這篇文章主要介紹了三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用,感興趣的朋友可以參考一下
    2016-01-01
  • ROS控制Turtlebot3移動(dòng)機(jī)器人的基礎(chǔ)教程

    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)

    這篇文章主要介紹了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磁盤格式化命令詳解

    Linux磁盤格式化命令詳解

    這篇文章主要介紹了Linux磁盤格式化命令以及具體操作步驟,需要的朋友參考一下吧。
    2017-11-11
  • Linux使用partprobe更新分區(qū)表的示例代碼

    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查詢服務(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
  • Apache 安全配置方法

    Apache 安全配置方法

    在本文中,筆者將為你提供10個(gè)技巧,借此你可以保護(hù)自己的Apache Web服務(wù)器免于受到許多攻擊。不過(guò),必須謹(jǐn)記,你需要仔細(xì)地評(píng)估每一個(gè)技巧,以確保其適合于你的組織。
    2010-12-12
  • 正確配置與維護(hù)Apache安全性設(shè)置方法

    正確配置與維護(hù)Apache安全性設(shè)置方法

    Apache Server是一個(gè)非常優(yōu)秀,非常棒的服務(wù)器,只要你正確配置和維護(hù)好Apache服務(wù)器,你就會(huì)感受到Apache Server 所帶來(lái)的好處,同樣希望你能夠通過(guò)閱讀本文達(dá)到理論和實(shí)踐雙豐收的目的。
    2010-12-12
  • Linux防火墻配置及放行端口方式

    Linux防火墻配置及放行端口方式

    文章介紹了firewalld防火墻的基本操作與配置方法,包括狀態(tài)查看、開關(guān)及開機(jī)啟動(dòng)設(shè)置;端口放行(如80/90端口)、作用域指定、IP訪問(wèn)控制及規(guī)則刪除;強(qiáng)調(diào)需重新加載規(guī)則使配置生效,并提供相關(guān)命令示例
    2025-08-08

最新評(píng)論

镇安县| 汶川县| 固镇县| 分宜县| 巍山| 景洪市| 绍兴市| 太保市| 绍兴市| 治多县| 泾源县| 枣强县| 津南区| 象州县| 西乌珠穆沁旗| 阜新市| 璧山县| 长白| 苍山县| 神池县| 肥西县| 麻阳| 泰宁县| 广昌县| 沧源| 宿松县| 罗定市| 卢湾区| 宾阳县| 达日县| 金溪县| 广平县| 高阳县| 河池市| 象山县| 长乐市| 碌曲县| 金门县| 澄迈县| 华池县| 昂仁县|