Makefile VPATH和vpath的使用

2021-06-20 15:49:26 字數 2719 閱讀 4467

首先是makefile 檔案和include資料夾還有src資料夾在同乙個目錄下

標頭檔案hello.h在include目錄下

原始檔main.cpp和hello.cpp在src目錄下

hello.h:

#ifndef _hello_h__

#define _hello_h__

void hello();

#endif

/#include

#include"hello.h"

using namespace std;

void hello()

/main.cpp:

#include

#include"hello.h"

using namespace std;

int main()

/makfile:

#vpath=include:src

vpath %.cpp src

vpath %.h include

test:main.o hello.o

g++ -o $@ main.o hello.o

main.o:main.cpp hello.h

g++ -c $< -iinclude

hello.o:hello.cpp hello.h

g++ -c $< -iinclude

.phony:clean

clean:

-rm test hello.o

//因為makefile、hello.h hello.cpp main.cpp沒有在同乙個路徑,所以要考慮路徑的問題

同時,路徑也有兩種,一種是針對makefile來說在執行make命令的時候,要尋找目標檔案和依賴檔案的路徑

另乙個就是原始檔所要包含的標頭檔案等相關檔案的路徑。

對於第一種來說,makefile 提供了兩種方式,一種是設定全域性訪問路徑vapth:即在執行make命令時可以從該路徑中查詢目標和依賴make可識別乙個特殊變數「vpath」。通過變數「vpath」可以指定依賴檔案的搜尋路徑,

在規則的依賴檔案在當前目錄不存在時,make會在此變數所指定的目錄下去尋找這些依賴檔案。

一般我們都是用此變數來說明規則中的依賴檔案的搜尋路徑。其實「vpath」變數所指定的是

首先說明一下makefile的執行步驟:

1、讀入所有的makefile。

2、讀入被include的其它makefile。

3、初始化檔案中的變數。

4、推導隱晦規則,並分析所有規則。

5、為所有的目標檔案建立依賴關係鏈。

6、根據依賴關係,決定哪些目標要重新生成。

7、執行生成命令

makefile中所有檔案的搜尋路徑,包括依賴檔案和目標檔案。 

變數「vpath」的定義中,使用空格或者冒號(:)將多個目錄分開。make 搜尋的目錄順序

按照變數「vpath」定義中順序進行(當前目錄永遠是第一搜尋目錄)。

例如:vpath = src:../headers

它指定了兩個搜尋目錄,「src」和「../headers」。對於規則「foo:foo.c」如果「foo.c」在「src」

目錄下,此時此規則等價於「foo:src:/foo.c」

對於第二種來說:當需要為不型別的檔案指定

不同的搜尋目錄時需要這種方式

vpath:關鍵字

它所實現的功能和上一小節提到的「vpath」變數很類似,但是

它更為靈活。它可以為不同型別的檔案(由檔名區分)指定不同的搜尋目錄。它的使用方法有三

種1、vpath pattern directories 

為符合模式「pattern」的檔案指定搜尋目錄「directories」。多個目錄使用空格或者

冒號(:)分開。類似上一小節的「vpath」 

2、vpath pattern 

清除之前為符合模式「pattern」的檔案設定的搜尋路徑

3、vpath

清除所有已被設定的檔案搜尋路徑。

對於vpath的詳細說明待續。

在執行make命令的時候,根據makefile執行步驟,首先讀入所有的makefile檔案,那麼

vpath = include:src       //指定了makefile的搜尋路徑

或者vpath %.h include    //指定.h型別檔案的搜尋路徑是include

vpath %.cpp src      //指定.cpp型別檔案的搜尋路徑是src

這僅僅是對於makefile來說搜尋目標和依賴檔案的路徑,但是對於命令列來說是無效的,也就是說

在執行g++或者gcc時不會自動從vpath 或者vpath中自動搜尋要包含的標頭檔案等資訊檔案

此時要用到了 -i 或者--incude +路徑

例如依賴是:

main.o:main.cpp hello.h

即g++  -c  $<  -iinclude,這時候,g++會自動從include目錄中搜尋要包含的hello.h標頭檔案

例項:vpath += $(wildcard $(src)/*) $(wildcard $(src)/*/*) $(wildcard $(src)/*/*/*) #設定依賴檔案的搜尋路徑

$(c_objects_ddr): $(obj)/%.o: %.c makefile  #靜態模式中%.c中的.c檔案搜尋規則為先在makefile當前目錄找,如果沒有則在vpath指定目錄找

echo cc $<

$(cc) $(cflags) -c $< -o $@

OrCAD VCC5V和VCC3 3V 短路問題

經常遇到乙個很奇怪的問題,10.5版本畫的原理圖在用高版本如16.3 16.5開啟後會出現5v和3.3v短路的情況,這樣drc檢查不會報錯,若到pcb layout時依然不能發現此問題,則會導致pcb板上的電源5v和3.3v連到一起。如下圖 圖1 經過反覆的實驗發現了原因 運放的電源pin一般都命名...

1V公升壓5V和1 5V公升壓5V的積體電路晶元

1.5v和1v輸入,要公升壓輸出5v的積體電路晶元合適?乾電池標準電壓是1.5v,放電電壓後面在0.9v 1v左右,如果要選用乾電池1.5v公升壓到5v的合適的晶元,需要滿足低壓1v或者0.9v更好的低壓輸入範圍的公升壓晶元。pw5100是輸入電壓範圍在0.7v低壓,到5v的寬範圍輸入電壓。適用於乾...

18V轉3 3V的電源晶元和40V的LDO

18v轉3.3v,15v轉3.3v的ldo pw6206的輸入電壓4.75v 40v,負載電流為在電壓 5v和vin 7v時高達300ma。該裝置採用bcd工藝製造。pw6206 提供過電流限制 軟啟動和過溫保護,確保裝置工作在正常情況下。pw6206提供3v,3.3v,5v輸出電壓選擇,靜態電流4...