make與makefile的基本使用與深入
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 #在目標指令之前加上@,這條目標走指令在執行的是偶不會再控制檯中輸出
相關推薦
make與makefile的基本使用與深入
一、 工具make的使用與makefile指令碼 背景: make編譯指令碼解釋 編譯指令碼makefile make -f 指令碼檔案 目標 指令碼檔案: 1. 文字檔案 (例如 d
linux之make與makefile
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
git與github基本概念
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地圖:Kconfig與Makefile
led page 一個 兩個 驅動 ash and 基本上 ttl Makefile不是Make Love 從前在學校,混了四年,沒有學到任何東西,每天就是逃課,上網,玩遊戲,睡覺。畢業的時候,人家跟我說Makefile我完全不知,但是一說Make Love我就來勁了,現在
Gradle與Makefile構建工具的對比
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之YAML與Ansible基本元素
遠程連接 縮進 排列 簡潔 小寫 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 網關的設置參考