開始接觸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