? ? ? ?
??
??Yan-英杰的主頁
悟已往之不諫 知來者之可追??
C++程序員,2024屆電子信息研究生
目錄
一、背景
二、Makefile
? ? ? ? 實現(xiàn)
? ? ? ? Makefile依賴
????????依賴關系
? ? ? ? makefile的工作原理
????????項目清理
????????補充:
? ? ? ? .PHONY是什么?
? ? ? ?Linux如何進行多行注釋:
????????說明:
三、Linux小程序(進度條)
四、使用git命令行
五、git三板斧
????????下載項目到本地
????????三板斧第一招: git add
????????三板斧第二招: git commit
????????三板斧第三招:git push
一、背景
???????? 會不會寫makefifile,從一個側(cè)面說明了一個人是否具備完成大型工程的能力一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefifile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作makefifile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。make是一個命令工具,是一個解釋makefifile中指令的命令工具,一般來說,大多數(shù)的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?,makefifile都成為了一種在工程方面的編譯方法。make是一條命令,makefifile是一個文件,兩個搭配使用,完成項目自動化構建。
二、Makefile
? ? ? ? 實現(xiàn)
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
????????Makefifile文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o hello.s:hello.i gcc -S hello.i -o hello.s hello.i:hello.c gcc -E hello.c -o hello.i
? ? ? ? Makefile依賴
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
????????依賴關系
????????上面的文件 hello ,它依賴 hell.o????????hello.o , 它依賴 hello.s????????hello.s , 它依賴 hello.i????????hello.i , 它依賴 hello.c
? ? ? ? makefile的工作原理
? ? ? ? ? ? ? ? ① make命令會在當前目錄下找到名字叫 “Makfile”或“makefile”的文件——>②首先找到,第一個目標文件,在上面的例子中,他會先找到hello這個文件,并把這個文件作為最終文件——> ③ 如果hello文件不存在,或者是hello所依賴的hello.o這個文件的修改時間要比hello.o這個文件行,那么他就會執(zhí)行后面所定義的命令來生成hello這個文件——> ④? 如果hello所依賴hello.o文件不存在,那么make會在當前文件中找目標為hello.o文件的依賴性,如果找到則再根據(jù)那一個規(guī)則生成hello.o文件。(這有點像一個堆棧的過程)——> ⑤ 當然,你的C文件和H文件是存在的啦,于是make會生成 hello.o 文件,然后再用 hello.o 文件聲明make的終極任務,也就是執(zhí)行文件hello了。 ——> ⑥ 這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。 ——> ⑦ 在找尋的過程中,如果出現(xiàn)錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。 ——> ⑧??make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在
????????
????????項目清理
????????
????????像clean這種,沒有被第一個目標文件直接或間接關聯(lián),那么它后面所定義的命令將不會被自動執(zhí)行, 不過,我們可以顯示要make執(zhí)行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。但是一般我們這種clean的目標文件,我們將它設置為偽目標,用.PHONY 修飾,偽目標的特性是,總是被執(zhí)行的??梢詫⑽覀兊?hello 目標文件聲明成偽目標,測試一下
????????補充:
? ? ? ? .PHONY是什么?
???????? .PHONY是一個偽目標,
????????可以防止在Makefile中定義的只執(zhí)行命令的目標和工作目錄下的實際文件出現(xiàn)名字沖突,另一種是提交執(zhí)行makefile時的效率。
? ? ? ?Linux如何進行多行注釋:
? ? ? ? 1.ESC退出到命令模式
? ? ? ? 2.ctrl+v 切換到可視化模式
? ? ? ? 3.HJKL挪動光標位置
? ? ? ? 4.shift+i輸入//
? ? ? ? 5.再按ESC即可,進行多行注釋
????????說明:
????????(1)偽目標意思是這個目標本身不代表一個文件,執(zhí)行這個目標不是為了得到某個文件或東西,而是單純?yōu)榱藞?zhí)行這個目標下面的命令。
????????(2)偽目標一般都沒有依賴,因為執(zhí)行偽目標就是為了執(zhí)行目標下面的命令。既然一定要執(zhí)行命令了那就不必加依賴,因為不加依賴意思就是無條件執(zhí)行。
????????(3)偽目標可以直接寫,不影響使用;但是有時候為了明確聲明這個目標是偽目標會在偽目標的前面用.PHONY來明確聲明它是偽目標
.PHONY clean
clean:
rm -rf *.o
? ? ? ?使make命令會自動繞過隱含規(guī)則搜索過程,也就是說執(zhí)行命令make clean會自動忽略名
為"clean"文件的存在,因此聲明.PHONY配置項會改善性能,并且不需要擔心實際同名文件存在
與否。
三、Linux小程序(進度條)
? ? ? ?依賴關系:Makefile
????????
processbar: main.c processBar.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f processbar
? ? ? ??processBar.h
????????
#pragma once
#include<stdio.h>
#include<string.h>
#include<unistd.h>
extern void processbar();
????????
? ? ? ? processBar.c
????????
#include "processBar.h"
void processbar()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
const char *lable="|/-\\";
while(i <= 100)
{
printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
printf("\n");
}
四、使用git命令行
? ? ? ? 背景:
????????Git屬于分散型版本管理系統(tǒng),是為版本管理而設計的軟件。
????????Linux的創(chuàng)始人Linus Torvalds在2005年開發(fā)了Git的原型程序。當時,由于在Linux內(nèi)核開發(fā)中使用的既有版本管理系統(tǒng)的開發(fā)方許可證發(fā)生了變更,為了更換新的版本管理系統(tǒng),Torvalds開發(fā)了Git。
????????Linux內(nèi)核的更新速度在全世界也算首屈一指。因此,勢必需要一個功能強、性能高的版本管理系統(tǒng)來提高開發(fā)速度。
????????在當時的開源環(huán)境下,雖然已經(jīng)有數(shù)款版本管理軟件被開發(fā)出來,但功能和性能都差強人意。加之Git是由Linus Torvalds親自著手開發(fā)的,可以說在功能與性能方面無可挑剔。程序員們愿意接受Git,很大程度上取決于這個背景。
????????
????????
五、git三板斧
????????下載項目到本地
????????三板斧第一招: git add
????????
??git clone https://www.xxxx.com/xxxxxx
????????將代碼放到剛才下載好的目錄中??????????????將需要用 git 管理的文件告知 git
????????三板斧第二招: git commit
????????提交改動到本地????????最后的 "." 表示當前目錄????????提交的時候應該注明提交日志, 描述改動的詳細內(nèi)容 .
????????
? ? ? ? 當遇到commit提交時,git命令無法識別,提交人的身份應該如何解決這種問題?
????????
//修改默認郵箱和賬戶
git config --global user.email "xxx@qq.com"
git config --global user.name "Yan-英杰"
文章來源:http://www.zghlxwxcb.cn/news/detail-568164.html
????????三板斧第三招:git push
????????????????同步到遠端服務器上 文章來源地址http://www.zghlxwxcb.cn/news/detail-568164.html
git push
????????同步到遠端服務器上????????需要填入用戶名密碼. 同步成功后 , 刷新 Github 頁面就能看到代碼改動了
到了這里,關于【操作系統(tǒng)】Liunx項目自動化構建工具-make/Makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!