开始接触Makefile已经有好几个月了,最近想好好学习学习 但是一个简单的问题就卡壳了很简单的一个问题 |-- Makefile 首先是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 ////////////////////////////////// 因为Makefile、hello.h hello.cpp main.cpp没有在同一个路径,所以要考虑路径的问题 同时,路径也有两种,一种是针对Makefile来说在执行make命令的时候,要寻找目标文件和依赖文件的路径 另一个就是源文件所要包含的头文件等相关文件的路径。 对于第一种来说,Makefile 提供了两种方式,一种是设置全局访问路径VAPTH:即在执行make命令时可以从该路径中查询目标和依赖make可识别一个特殊变量“VPATH”。通过变量“VPATH”可以指定依赖文件的搜索路径, 1、读入所有的Makefile。 Makefile中所有文件的搜索路径,包括依赖文件和目标文件。 例如: VPATH = src:../headers 它指定了两个搜索目录,“src”和“../headers”。对于规则“foo:foo.c”如果“foo.c”在“src” 对于第二种来说:当需要为不类型的文件指定 vpath:关键字 它所实现的功能和上一小节提到的“VPATH”变量很类似,但是 1、vpath PATTERN DIRECTORIES 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头文件 |
|