linux中makefile設置路徑的問題

開始接觸Makefile已經有好幾個月了,最近想好好學習學習ios

可是一個簡單的問題就卡殼了很簡單的一個問題spring

|-- Makefile
|-- include
|   `-- hello.h
`-- src
    |-- hello.cpp
    `-- main.cp學習

首先是Makefile 文件和include文件夾還有src文件夾在同一個目錄下spa

頭文件hello.h在include目錄下命令行

源文件main.cpp和hello.cpp在src目錄下io

////////////////////////////////class

hello.h:test

#ifndef _HELLO_H__stream

#define _HELLO_H__變量

void hello();

#endif

///////////////////////////

hello.cpp:

#include<iostream>

#include"hello.h"

using namespace std;

void hello()

{

        cout<<"Hello world"<<endl;

}

/////////////////////////////

main.cpp:

#include<iostream>

#include"hello.h"

using namespace std;

int main()

{

          hello();

          return 0;

}

/////////////////////////////////

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的執行步驟:

一、讀入全部的Makefile。
二、讀入被include的其它Makefile。
三、初始化文件中的變量。
四、推導隱晦規則,並分析全部規則。
五、爲全部的目標文件建立依賴關係鏈。
六、根據依賴關係,決定哪些目標要從新生成。
七、執行生成命令

Makefile中全部文件的搜索路徑,包括依賴文件和目標文件。 
變量「VPATH」的定義中,使用空格或者冒號(:)將多個目錄分開。make 搜索的目錄順序
按照變量「VPATH」定義中順序進行(當前目錄永遠是第一搜索目錄)。

例如:

VPATH = src:../headers

它指定了兩個搜索目錄,「src」和「../headers」。對於規則「foo:foo.c」若是「foo.c」在「src」
目錄下,此時此規則等價於「foo:src:/foo.c」

對於第二種來講:當須要爲不類型的文件指定
不一樣的搜索目錄時須要這種方式

vpath:關鍵字

它所實現的功能和上一小節提到的「VPATH」變量很相似,可是
它更爲靈活。它能夠爲不一樣類型的文件(由文件名區分)指定不一樣的搜索目錄。它的使用方法有三

一、vpath PATTERN DIRECTORIES 
爲符合模式「PATTERN」的文件指定搜索目錄「DIRECTORIES」。多個目錄使用空格或者
冒號(:)分開。相似上一小節的「VPATH」 
二、vpath PATTERN 
清除以前爲符合模式「PATTERN」的文件設置的搜索路徑

三、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頭文件     spring  123@123.com

相關文章
相關標籤/搜索