linux中makefile設置路徑的問題


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

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

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

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

頭文件hello.h在include目錄下

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

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

hello.h:

#ifndef _HELLO_H__

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM