1. 程式人生 > >make與makefile的基本使用與深入

make與makefile的基本使用與深入

一、 工具make的使用與makefile指令碼 背景: make編譯指令碼解釋 編譯指令碼makefile make -f 指令碼檔案 目標 指令碼檔案: 1. 文字檔案  (例如 demo.mk) 2. 基本構成語法 基本單位目標target 目標名:依賴目標 \t目標指令 \t目標指令 \[email protected]目標指令   //加上@以後,在執行的時候,這一條目標指令就不會再控制檯中輸出了...

2.目標的劃分
    目標依賴

  3.預設規則:
    a.不指定目標,執行第一個目標
    b.不指定make檔案,預設檔案是makefile Makefile
      makefile優先
  4.目標的呼叫規則:(make把目標當作檔案)
    make執行目標:
      搜尋與目標相同的檔案
      如果檔案存在,則判定日期。
      日期最新,則停止執行,輸出提示
      日期不是最新,則進行執行。

      比較:當前目標與依賴目標

 --------》 換一句話說就是,當目標名不存在的時候,執行該條目標指令。若該目標名存在,則判斷目標名的時間

是否是最新的。如果目標名的時間是最新的,則不執行其對應的目標指令,否則執行該條目標指令。

例子:

makefile檔案編寫如下:

var= inputInt.o add.o

xixi:
        ls -l
inputInt.o:inputInt.c
        gcc -c inputInt.c
add.o:add.c
        gcc -c add.c
libdemo1.so:$(var)
        gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
        gcc main.c -omain -ldemo1 -L.
.PHONY:clean
clean:
        @rm -f main

1)make main

[fedo[email protected] day02_r3]$ make main
gcc -c inputInt.c
gcc -c add.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.

2)這時候如果再執行make main 指令,我們會看到以下資訊:

[[email protected] day02_r3]$ make main
make: `main' is up to date.

3)如果我們刪掉inputInt.o,再執行make main(刪除add.o的現象是差不多的

),這時候,我們會看到以下資訊

[[email protected] day02_r3]$ rm inputInt.o
[[email protected] day02_r3]$ make main
gcc -c inputInt.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.

4)如果我們刪掉libdemo1.so,再執行make main,這時候,我們會看到以下資訊

[[email protected] day02_r3]$ rm libdemo1.so
[[email protected] day02_r3]$ make main
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.

5)如果我們刪掉main,再執行make main,這時候,我們會看到以下資訊

[[email protected] day02_r3]$ rm main
[[email protected] day02_r3]$ make main
gcc main.c -omain -ldemo1 -L.


  5.建議:
    只要有檔案輸出,就把任務作為一個目標,並且把輸出的檔案作為目標名。
    
  6.潛規則(不建議)
    .c目標與.o目標。
    查詢.o目標,目標不存在,就把.o替換成.c
    如果.c存在,實施潛規則:直接呼叫gcc把.c執為.o

換一句話講,所謂的潛規則就是,當作為依賴目標的.o檔案不存在的時候,系統會自動的去找同名的.c檔案是否存在,如果同名的.c檔案存在,則系統會先將該同名的 .c 檔案編譯成 .o 檔案.

例子:

1)先把當前目錄中的inputInt.o 和add.o 檔案刪除,但保留inputInt.c 和add.c 檔案

2)這時候的makefile檔案如下所示(即這時候,環境中沒有了libdemo1.so所依賴的.o檔案):

var= inputInt.o add.o


xixi:
        ls -l
#inputInt.o:inputInt.c
  #      gcc -c inputInt.c
#add.o:add.c
  #      gcc -c add.c
libdemo1.so:$(var)
        gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
        gcc main.c -omain -ldemo1 -L.
.PHONY:clean
clean:
        @rm -f main

3)執行make main命令,這時候,你會在控制檯中看到以下資訊:

[[email protected] day02_r3]$ make main
cc    -c -o inputInt.o inputInt.c
cc    -c -o add.o add.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.

其中的,

cc    -c -o inputInt.o inputInt.c
cc    -c -o add.o add.c

就是這裡的潛規則的體現。。。


  7.變數
    變數名=值 值
    
    $(變數名)  ${變數}  
  8.偽目標:
    不把目標作為檔案處理的目標稱為偽目標
    宣告偽目標  
沒有:
  1.make的配置
  2.make的變數的操作函式
  3.多make檔案使用


例子:
var= inputInt.o add.o  #變數的定義

xixi:
        ls -l
inputInt.o:inputInt.c #這裡體現了目標依賴
        gcc -c inputInt.c
add.o:add.c        #這裡體現了多目標劃分
        gcc -c add.c
libdemo1.so:$(var)   #變數的使用,還可以通過${var}的形式進行使用
        gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
        gcc main.c -omain -ldemo1 -L.
.PHONY:clean   #這裡是偽目標的定義
clean:
        @rm -f main   #在目標指令之前加上@,這條目標走指令在執行的是偶不會再控制檯中輸出


相關推薦

makemakefile基本使用深入

一、 工具make的使用與makefile指令碼 背景: make編譯指令碼解釋 編譯指令碼makefile make -f 指令碼檔案 目標 指令碼檔案: 1. 文字檔案  (例如 d

linux之makemakefile

make是一個命令,Makefile是一個檔案(可大寫也可以小寫) Makefile裡面放的是依賴關係和依賴方法 新建一個makefile檔案,在Makefile裡寫: hello:hello.c gcc -o hello hello.c      

make makefile的作用

在開發一個系統時,一般是將一個系統分成幾個模組,這樣做提高了系統的可維護性,但由於各個模組間不可避免存在關聯,所以當一個模組改動後,其他模組也許會有所更新,當然對小系統來說,手工編譯連線是沒問題,但是如果是一個大系統,存在很多個模組,那麼手工編譯的方法就不適用了。為此,在

make命令makefile檔案

一、多個原始檔帶來的問題 在編寫c/c++測試程式時,我們習慣每次修改一處程式碼,然後就馬上編譯執行來檢視執行的結果。這種編譯方式對於小程式來說是沒有多大問題的,可對於大型程式來說,由於包含了大量的原始檔,如果每次改動一個地方都需要編譯所有的原始檔,這個簡單的

Ubuntu——Makefile檔案make命令

  在Shell指令碼中使用make命令來進行編譯,尤其在C/C++開發中,make命令通過makefile檔案中描述源程式之間的依賴關係進行自動編譯;makefile檔案是按照規定格式編寫,需說明如何編譯各個原始檔並連線生成可執行檔案,並要求定義原始檔之間的依

面向對象的三大特性五大基本原則

同時 屬性 open for idt emma 這樣的 interface bili 體系 三大特性:封裝,繼承,多態 封裝:就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向對象的特征之一,是對象和類概念

30天自制操作系統(二)匯編語言學習Makefile入門

-c 如何 wid 開發 大小端 bio strong 入門 小端 1 介紹文本編輯器 這部分可直接略過 2 繼續開發 helloos.nas中核心程序之前的內容和啟動區以外的內容先不講了,因為還涉及到一些軟盤方面的知識。然後來講的是helloos.nas這個文件 ; h

s3c2440內存控制器SDRAM基本測試

tar pan dram 要求 直接 而是 ash cpu size 前面我們實驗的LED和串口程序,是cpu發送地址給特定的寄存器,在寄存器中寫相應的位,達到控制要求。 第一類是GPIO門電路如LED,第二類是協議類如串口,這些都不是cpu直接給地址信息,而是通過寄存器來

一、消息隊列介紹RabbitMQ基本示例

情況 routing 示例 兩個 lba 生產者 src 客戶端 應用 Python裏面的消息機制是QUEUE,它與RabbitMQ幹的事情是一樣的,都是消息隊列。QUEUE是傳遞消息的,典型的應用場景就是生產者、消費者模型。那麽RabbitMQ到底與Python裏的QUE

gitgithub基本概念

div internal 來源 b16 alt col href height 版本控制工具 git和github是什麽? 通俗的說(來源 Git 跟 GitHub 是什麽關系?): git是一個版本控制工具github是一個用git做版本控制的項目托管平臺。 git是工具

學習總結:工程管理makefile

管理 用法 ron 有效 第一個 可執行 多目錄 log 包含 工程管理與makefile 一、為什麽需要makefile和make 一個工程中的源文件可能很多,按照類型、功能、模塊分別放在若幹個目錄中,為了有效地管理軟件工程,更高效地編譯整個工程,需要用到makefile

Linux內核(1) - Kernel地圖:KconfigMakefile

led page 一個 兩個 驅動 ash and 基本上 ttl Makefile不是Make Love 從前在學校,混了四年,沒有學到任何東西,每天就是逃課,上網,玩遊戲,睡覺。畢業的時候,人家跟我說Makefile我完全不知,但是一說Make Love我就來勁了,現在

GradleMakefile構建工具的對比

tro 2.4 ani 所有 常用 基礎 assemble 第三方 ron 隨著Android Studio的普及,越來越多的Android開發者也要開始了解和學習Gradle這款強大的代碼構建工具了。我們在學習和了解一項新事物的時候,最快速的方法往往是與已知的事物進行比較

CentOS7.5之MongoDB4.0安裝CRUD基本操作

agg 測試 布爾 分配 unity 基本上 page 原理 utc 一 MongoDB簡介 MongoDB 是一個基於分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。 MongoDB 是一個介於關系數據庫和非關

iOS開發·runtime原理新葡京網站開發實踐: 基本知識篇

方法 流程 oot 發的 以及 soc 實例方法 desc 描述 運行時新葡京網站開發 haozbbs.com Q1446595067 1.1 基本概念: 運行時 Runtime 的概念 Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iOS 內部的核心

自動化部署之Ansibler之YAMLAnsible基本元素

遠程連接 縮進 排列 簡潔 小寫 usr ssh命令 配置 scp YANL 介紹 YAML:另一種標記語言。是用來寫配置文件的語言,非常簡潔和強大。YAML語法和其他語言類似,也可以表達散列表、標量等數據結構。結構通過空格來展示;序列裏配置項通過-來代表;Map裏鍵值用

VRRP協議keepalived基本原理實例演示

int ip地址 sta ipvs ffffff centos6.4 搶占模式 進行 conn VRRP是什麽?VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗余協議)是一種容錯協議,保證當主機的下一條路由器出現故障時,由另一臺路

Django1-web概述django基本操作

超文本 resp run str strong 窗口 post manage flask WEB概述 瀏覽器和服務端通信都要遵循一個HTTP協議(消息的格式要求) 動態的網頁,本質上都是字符串的替換(再服務端),替換完就返回給瀏覽器 版本 廣泛版本 --> HTTP1

ready事件load事件的深入理解--

斜體樣式首先看一下window和document的區別 window 1.window物件表示瀏覽器中開啟的視窗。 2.window物件可以省略,如:window.console.log()等價於console.log() document 1.document物件是window物件的一

hadoop-虛擬機配置hadoop基本配置

efi shuff lap 目錄 測試 rep 成功 apach eno 一、虛擬機設置 環境:centos6.4 vmware網絡適配器:橋接模式,禁用vmnet8 vim /etc/sysconfig/network-scripts/ifcfg-eth0 網關的設置參考