1. 程式人生 > >初步makefile的詳解:

初步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$ 
執行結果:

[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
    

[email protected]:~/make$ 

相信在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 納秒 導讀: 人類把時間做了切割,想象一條筆直的線永遠向前,本來這條直線上什麽都沒有,但是人類根據時間的長短(單位)在這條直線上做了密密麻麻的標記(世紀-年-月-日-時-分-秒-納秒......),通過