初步makefile的詳解:
makefile的規則:
目標檔案 : 依賴檔案 //根據依賴檔案生成目標檔案
command(任意的shell命令) //此處一定要有一個Tab;
clean :
rm -rf //此處刪除生成的檔案,以便於下一次重新編譯。此處也要有Tab鍵。
舉個例子:
print.h 檔案
#include<stdio.h>
void hh();
print.c檔案
#include"print.h"
#include<stdio.h>
void hh()
{
printf("hello world\n");
}
main.c檔案
#include"print.h"
#include<stdio.h>
void hh()
{
printf("hello world\n");
}
[email protected]:~/make$ cat main.c
#include "print.h"
int main(void)
{
hh();
return 0;
}
makefile檔案:
[email protected]:~/make$ vi makefile
[email protected]:~/make$ cat makefile
helloworld : main.o print.o
gcc -o helloworld main.o print.o
./helloworld
main.o : main.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld main.o print.o
執行結果:
[email protected]:~/make$ vi makefile
[email protected]:~/make$ cat makefile
helloworld : main.o print.o
gcc -o helloworld main.o print.o //要生成的hellowor
./helloworld
main.o : main.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld main.o print.o
相信在unix下程式設計的沒有不知道makefile的,剛開始學習unix平臺
下的東西,瞭解了下makefile的製作,覺得有點東西可以記錄下。
下面是一個極其簡單的例子:
現在我要編譯一個Hello world,需要如下三個檔案:
1. print.h
#include<stdio.h>
void printhello();
2. print.c
#include"print.h"
void printhello(){
printf("Hello, world\n");
}
3. main.c
#include "print.h"
int main(void){
printhello();
return 0;
}
好了,很簡單的程式了。如果我們想要編譯成功需要哪些步驟呢?
我認為在這裡需要理解的就兩步:
# 為每一個 *.c檔案生成 *o檔案。
# 連線每一個*o檔案,生成可執行檔案。
下面的makefile 就是根據這樣的原則來寫的。
一:makefile 雛形:
#makefile的撰寫是基於規則的,當然這個規則也是很簡單的,就是:
#target : prerequisites
command //任意的shell 命令
例項如下:
makefile:
helloworld : main.o print.o #helloword 就是我們要生成的目標
# main.o print.o是生成此目標的先決條件
gcc -o helloworld main.o print.o#shell命令,最前面的一定是一個tab鍵
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld main.o print.o
OK,一個簡單的makefile製作完畢,現成我們輸入 make,自動呼叫Gcc編譯了,
輸入 make clean就會刪除 hellowworld mian.o print.o
二:小步改進:
在上面的例子中我們可以發現 main.o print.o 被定義了多處,
我們是不是可以向C語言中定義一個巨集一樣定義它呢?當然可以:
makefile:
objects = main.o print.o #應該叫變數的宣告更合適
helloworld : $(objects) //聲明瞭變數以後使用就要$()了
gcc -o helloworld$(objects)
mian.o : mian.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean :
rm helloworld $(objects)
修改完畢,這樣使用了變數的話在很多檔案的工程中就能體現出方便性了。
三:再進一步:
再看一下,為沒一個*.o檔案都寫一句gcc -c main.c是不是顯得多餘了,
能不能把它幹掉?而且 main.c 和print.c都需要print.h,為每一個都寫上是
不是多餘了,能不能再改進?
能,當然能了:
makefile:
objects = main.o print.o
helloworld : $(objects)
gcc -o helloworld$(objects)
$(objects) : print.h # 都依賴print.h
mian.o : mian.c #幹掉了gcc -c main.c 讓Gun make自動推導了。
print.o : print.c
clean :
rm helloworld $(objects)
好了,一個簡單的makefile就這樣完畢了,簡單吧。
相關推薦
初步makefile的詳解:
makefile的規則: 目標檔案 : 依賴檔案 //根據依賴檔案生成目標檔案 command(任意的shell命令) //此處一定要有一個Tab; clean : rm -rf //此處刪除生成的檔案,以
u-boot 分析:Makefile詳解
2.1 U-Boot Makefile分析 2.1.1 U-Boot編譯命令 對於mini2440開發板,編譯U-Boot需要執行如下的命令: $ make mini2440_config $ make all 使用上面的命令編譯U-B
ThinkPHP函數詳解:F方法
過濾 thinkphp 子目錄 讀取 數據緩存 文件 快速 由於 寫入 我們已體味了ThinkPHP中的S編制的用法,F編制其實是S編制的一個子集功用,僅用於復雜數據緩存,而且只能支撐文件方式,不支撐緩存有用期,由於采取的是PHP前往編制,所以其效率較S編制較高,是以我
【轉載】瀏覽器緩存詳解:expires cache-control last-modified
導致 lang -c csdn 判斷 屬性 lan -m load 最近在對CDN進行優化,對瀏覽器緩存深入研究了一下,記錄一下,方便後來者 畫了一個草圖: 每個狀態的詳細說明如下: 1、Last-Modified 在瀏覽器第一次請求某一個URL時,服務器端的返回
PHP面向對象詳解:繼承、封裝與多態
gets key copy nes col 成員變量 ret 封裝 文字 首先,在解釋面向對象之前先解釋下什麽是面向對象? [面向對象]1、什麽是類? 具有相同屬性(特征)和方法(行為)的一系列個體的集合,類是一個抽象的概念2、什麽是對象?從類中拿到的具有具體屬性值得個體,
ES6的箭頭函數詳解:
() nbsp console set 箭頭 settime argument style 生成 箭頭函數是ES6中新增一個函數表達形式,它是對函數的一種簡化ES6允許使用“箭頭”(=>)定義函數。 Eg: var f = v => v; 等同於之前 var f
Spring Boot 配置文件詳解:Properties和YAML
列表 config 其他 操作系統 des num mat 變量 onf 一.配置文件的生效順序,會對值進行覆蓋: 1. @TestPropertySource 註解 2. 命令行參數 3. Java系統屬性(System.getProperties
redis 下key的過期時間詳解 :expire
編寫 抽樣 通過 字符串 n) 開發包 有序集合 memcache jedis Redis是一個開源的Key-Value數據緩存,和Memcached類似。 Redis多種類型的value,包括string(字符串)、list(鏈表)、set(集合)、zset(sort
PHP函數詳解:call_user_func()使用方法
func instead 實例 div style bsp color can this call_user_func函數類似於一種特別的調用函數的方法,使用方法如下: <?php function nowamagic($a,$b) { echo
15年資深架構師詳解:一個大型互聯網公司的微服務轉型實踐
微服務 架構 單片服務 微服務是一個比較大的話題,基於我的過往經歷,本文將以 Netflix 為例,分享一個大型互聯網公司如何從一個 Monolithic 的 APP 成功轉型到微服務。文章主要涉及微服務的產生歷史,應用場景,與單片服務區別,微服務帶來的技術、企業組織結構等方面挑戰,以及如何合
IP地址的分類及範圍詳解:A、B、C、D、E五類是如何劃分的?
網絡地址分類 IP地址分類 IP地址劃分 IP地址類型 IP地址範圍 IP地址的分類及範圍詳解:A、B、C、D、E五類是如何劃分的?最近在考證,有一項內容是網絡IP地址劃分的題目,一直從事IT的猛然發現回答這個問題時產生了懷疑,於是習慣百度了一下,發現網上廣泛流傳的有關IP地址劃分的文章居
dva.js 用法詳解:列表展示
def bpa clas 開發 cal switch lan 點擊 code 本教程案例github:https://github.com/axel10/dva_demo-Counter-and-list/tree/master 這次主要通過在線獲取用戶數據並且渲染成列
zabbix_agentd.conf zabbix客戶端配置文件的相關參數的詳解:(二)
Zabbix客戶端 配置文件zabbix_agentd.conf zabbix客戶端配置文件的相關參數的詳解:Aliaskey的別名,例如 Alias=ttlsa.userid:vfs.file.regexp[/etc/passwd,^ttlsa:.:([0-9]+),,,,\1], 或者ttlsa的用戶ID
makefile詳解
makefile原文鏈接:https://blog.csdn.net/qq_38646470/article/details/79917494專欄鏈接:https://blog.csdn.net/column/details/20028.html 或許很多Wino
UX術語幸運飛艇源碼下載詳解:任務流,用戶流,流程圖以及其它全新術語
希望 演示 重要 職位 flow 重新 生成 img 所有 用戶幸運飛艇源碼下載【大神源碼論壇】dsluntan.com 【布丁源碼論壇】budingbbs.com 企娥3393756370 體驗擁有一長串專業的術語和可交付內容。當在線查看UX相關職位描述時,所羅列的這類
Sql 註入詳解:寬字節註入+二次註入
.com 主動 一個 from 攻擊 過濾 分享圖片 size 就是 sql註入漏洞 原理:由於開發者在編寫操作數據庫代碼時,直接將外部可控參數拼接到sql 語句中,沒有經過任何過濾就直接放入到數據庫引擎中執行了。 攻擊方式: (1) 權限較大時,直接寫入webshell
第20講 | 區塊鏈項目詳解:比特股BTS
代理服 work 直接 使用 代碼 for doc 地址 投資者 前面兩篇我們都聊了智能合約的話題,智能合約可以說是當下區塊鏈最熱的概念了,在多數人眼裏,沒有智能合約的區塊鏈價值幾乎就大打折扣。 那麽說,實際上是不是這樣呢,我們今天就來聊聊一個並沒有開放式智能合約
magento快取系列詳解:實施正確的快取策略及不同快取結構分析
本篇文章主要介紹一下在maegnto裡cache(File System, APC, Memcached, Redis)的使用,及在不同的伺服器環境中改怎麼使用讓其效能達到最佳。 理解magento的Two-Level Caching magento預設使用zend framework的
詳解:Linux Chrony 設置服務器集群同步時間
mar led ack www 我們 num lld 註意 orm 導讀: Chrony是一個開源的自由軟件,像CentOS 7或基於RHEL 7操作系統,已經是默認服務,默認配置文件在 /etc/chrony.conf 它能保持系統時間與時間服務器(NTP)同步,讓時間
詳解:(cron , crontab , anacron)
users 文件的 世紀 文件包含 尋找 簡單 win delete 納秒 導讀: 人類把時間做了切割,想象一條筆直的線永遠向前,本來這條直線上什麽都沒有,但是人類根據時間的長短(單位)在這條直線上做了密密麻麻的標記(世紀-年-月-日-時-分-秒-納秒......),通過