一、Linux項(xiàng)目自動(dòng)化構(gòu)建工具-make/Makefile
1、背景
- 會(huì)不會(huì)寫(xiě)makefile,從一個(gè)側(cè)面說(shuō)明了一個(gè)人是否具備完成大型工程的能力。
- 一個(gè)工程中的源文件不計(jì)數(shù),其按類型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規(guī)則來(lái)指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新譯,甚至于進(jìn)行更復(fù)雜的功能操作。
- makefile帶來(lái)的好處就是——“自動(dòng)化編譯”,一旦寫(xiě)好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開(kāi)發(fā)的效率。
- make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的命令工具,一般來(lái)說(shuō),大多數(shù)的IDE都有這個(gè)命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。makefile都成為了一種在工程方面的編譯方法。
- make是一條命令,makefile是一個(gè)文件,兩個(gè)搭配使用,完成項(xiàng)目自動(dòng)化構(gòu)建。
2、實(shí)例代碼
我們首先創(chuàng)建一個(gè)text.c文件
然后vim打開(kāi)text.c文件進(jìn)行編輯,編輯完后退出
創(chuàng)建一個(gè)makefile文件,并vim打開(kāi)進(jìn)行編寫(xiě)
并使用make指令進(jìn)行操作
3、依賴關(guān)系
上面的文件 text ,它依賴 text.o
text.o , 它依賴 text.s
text.s , 它依賴 text.i
text.i, 它依賴 text.c
4、依賴方法
gcc text.* -option text.* ,就是與之對(duì)應(yīng)的依賴關(guān)系
5、原理
make是如何工作的,在默認(rèn)的方式下,也就是我們只輸入make命令。那么,
- make會(huì)在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它會(huì)找文件中的第一個(gè)目標(biāo)文件(target),在上面的例子中,他會(huì)找到“text”這個(gè)文件,并把這個(gè)文件作為最終的目標(biāo)文件。
- 如果text文件不存在,或是text所依賴的后面的text.o文件的文件修改時(shí)間要比text這個(gè)文件新(可以用 touch 測(cè)試),那么,他就會(huì)執(zhí)行后面所定義的命令來(lái)生成hello這個(gè)文件。
- 如果text所依賴的text.o文件不存在,那么make會(huì)在當(dāng)前文件中找目標(biāo)為text.o文件的依賴性,如果找到則再根據(jù)那一個(gè)規(guī)則生成text.o文件。(這有點(diǎn)像一個(gè)堆棧的過(guò)程)
- 當(dāng)然,你的C文件和H文件是存在的啦,于是make會(huì)生成 text.o 文件,然后再用 text.o 文件聲明make的終極任務(wù),也就是執(zhí)行文件text了。
- 這就是整個(gè)make的依賴性,make會(huì)一層又一層地去找文件的依賴關(guān)系,直到最終編譯出第一個(gè)目標(biāo)文件。
- 在找尋的過(guò)程中,如果出現(xiàn)錯(cuò)誤,比如最后被依賴的文件找不到,那么make就會(huì)直接退出,并報(bào)錯(cuò),而對(duì)于所定義的命令的錯(cuò)誤,或是編譯不成功,make根本不理。
- make只管文件的依賴性,即,如果在我找了依賴關(guān)系之后,冒號(hào)后面的文件還是不在,那么對(duì)不起我就不工作啦。
6、項(xiàng)目清理
- 工程是需要被清理的
- 像clean這種,沒(méi)有被第一個(gè)目標(biāo)文件直接或間接關(guān)聯(lián),那么它后面所定義的命令將不會(huì)被自動(dòng)執(zhí)行,不過(guò),我們可以顯示要make執(zhí)行。即命令——“make clean”,以此來(lái)清除所有的目標(biāo)文件,以便重編譯。
- 但是一般我們這種clean的目標(biāo)文件,我們將它設(shè)置為偽目標(biāo),用 .PHONY 修飾,偽目標(biāo)的特性是,總是被執(zhí)行的。
- 可以將我們的 hello 目標(biāo)文件聲明成偽目標(biāo),測(cè)試一下。
二、Linux第一個(gè)小程序-進(jìn)度條
1、\r&&\n
‘\r’是回車,前者使光標(biāo)到行首,(carriage return)’\n’是換行,后者使光標(biāo)下移一格。
老式enter鍵
2、行緩沖區(qū)概念
1、什么現(xiàn)象?
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
sleep(3);
return 0;
}
2、什么現(xiàn)象?
#include <stdio.h>
int main()
{
printf("hello Makefile!");
sleep(3);
return 0;
}
3、什么現(xiàn)象?
#include <stdio.h>
int main()
{
printf("hello Makefile!");
fflush(stdout);
sleep(3);
return 0;
}
3、進(jìn)度條代碼
1、版本一
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
const char* lable="|/-\\";
int main()
{
char buffer[NUM];
memset(buffer, '\0', sizeof(buffer));
int cnt = 0;
int n = strlen(lable);
buffer[0] = Head;
while(cnt <= 100)
{
printf("[%-100s][%3d%%][%c]\r", buffer, cnt, lable[cnt%n]);
fflush(stdout);
buffer[cnt++] = '=';
if(cnt < 100) buffer[cnt] = '>';
usleep(50000);
}
printf("\n");
}
2、版本二 ,跟下載速度牽連文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-744422.html
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
typedef void (*callback_t)(double);
define max 103
define size 1024*1024*1024
const char* lable="|/-\\";
char buffer[max]={0};
void process_flush(double rate)
{
static int cnt = 0;
int n = strlen(lable);
if(rate <= 1.0) buffer[0] = '>';
printf("[%-100s][%.1f%%][%c]\r", buffer, rate, lable[cnt%n]);
fflush(stdout);
buffer[(int)rate] = '=';
if((int)rate+1 < 100) buffer[(int)(rate+1)] = '>';
if(rate>=100.0) printf("\n");
cnt++;
cnt%=n;
}
void download()
{
srand(time(NULL)^1023);
int total=size;
while(total)
{
int one=rand()%(1024*1024);
total-=one;
if(total<=0) total=0;
int download=size-total;
double rate = (download*1.0/(size))*100.0;
process_flush(rate);
}
}
int main()
{
download();
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744422.html
到了這里,關(guān)于Linux環(huán)境基礎(chǔ)開(kāi)發(fā)工具使用(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!