开始接触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