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