網站首頁 編程語言 正文
一、make和makefile的區別
make是一個命令,makefile是一個文件。
二、makefile的原理
1、make的原理詳解
每次生成可執行文件時需要輸入一長串的gcc········指令是不是感覺很麻煩?makefile存在的意義是為了項目的構建。需要表明依賴關系和依賴方法。
2、臨時文件的清理
mycode:mycode.c
gcc mycode.c -o mycode
.PHONY:clean
clean:
rm -f mycode
.PHONY表示被該關鍵字修飾的對象是一個偽目標。(該偽目標總是可被執行)
我們在編寫完makefile后,make一下,就能生成對應的可執行程序。如果依賴的文件列表沒有發生修改,gcc通過判斷mycode.c的Modify time早于mycode的Modify time,說明依賴文件列表沒有修改,那么再次make將會失敗;反之,重新編譯將會成功。
不過多次make clean卻不會失敗,因為clean被.PHONY修飾,變成了一個偽目標,所以clean總是可被執行。
3、文件的三個時間
[root@VM-4-11-centos ~]# stat 106/text.c
File: ‘106/text.c'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 658416 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-09-17 21:13:21.098656019 +0800//最近訪問
Modify: 2022-09-17 21:13:21.098656019 +0800//最近修改
Change: 2022-09-17 21:13:21.098656019 +0800//最近改動
Birth: -
1、讀取文件時,Access time被改變,而Modify、Change time不會被改變(為防止文件被頻繁訪問修改Access time,優化為多次訪問才修改一次該時間)
2、修改文件時,三個時間都會被改變
3、修改屬性時,Change time被改變,而Access、Modify time不會被改變
三、makefile的推導規則
makefile會自己逐步尋找依賴文件列表,如果沒找到對于依賴文件,將會繼續向下尋找該依賴文件的依賴方法。
四、實現一個進度條
1、緩沖區問題
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world\n");//如果這里沒有\n,程序將會在3秒后執行打印
//fflush(stdout);//fflush會立即刷新緩沖區
sleep(3);
return 0;
}
因為\n才會刷新緩沖區(\r等不會),這個程序printf執行完之后,將會休眠3秒,如果沒有\n或者fflush手動刷新緩沖區,hello world將會存放至緩沖區,程序結束后才執行打印。
2、實現倒計時程序
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt=10;
while(cnt)
{
printf("%2d\r",cnt);//2d控制刷新兩位,\r表示回車
fflush(stdout);//手動刷新緩沖區
sleep(1);
--cnt;
}
return 0;
}
能夠實現從10到計時的程序。
3、進度條的實現
//.h文件
#pragma once
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define NUM 101
#define STYLE '*'
extern void processOn();
//.c文件
#include "process.h"
void processOn()
{
int cnt=0;
char bar[NUM];
memset(bar,'\0',NUM);
char type[4]={'|','/','-','\\'};
while(cnt<=100)
{
//-100表示占據屏幕100個空間并左對齊,%%轉義為%
printf("[%-100s][%d%%][%c]\r",bar,cnt,type[cnt%4]);
bar[cnt++]=STYLE;
fflush(stdout);
usleep(50000);
}
printf("\n");
}
makefile中不用寫頭文件,編譯器自己會去找。
<>查找方式:直接去庫目錄下查找,如果找不到,報編譯錯誤;
""查找方式:先去代碼所在的路徑下查找,如果找不到,再去庫目錄下查找,如果找不到,報編譯錯誤。
原文鏈接:https://blog.csdn.net/gfdxx/article/details/127564396
相關推薦
- 2022-08-05 Redis實現分布式鎖的五種方法詳解_Redis
- 2022-06-01 Android利用MediaRecorder實現錄音功能_Android
- 2022-06-13 Docker容器數據卷介紹及操作示例_docker
- 2022-09-07 Python的flask常用函數route()_python
- 2022-09-03 C#實現工廠方法模式_C#教程
- 2023-08-16 el-col內容過長導致出現疊字錯誤
- 2022-08-02 Python深拷貝淺拷貝圖文示例清晰整理_python
- 2022-04-11 python文件讀寫操作小結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支