from–https://blog.csdn.net/luotuo44/article/details/16970841
先看两篇博文,作为基础知识。如果对C/C++编译链接过程都了解的话,可以跳过不看。
http://www.firedragonpzy.com.cn/index.php/archives/2556
http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html
一、 编译不同目录下的多个文件
各个文件的布局如下:
head.h文件的代码:
#ifndef HEAD_H
#define HEAD_H
int add(int a, int b);
#endif /*HEAD_H*/
head.cpp文件的代码:
#include “head.h”
int add(int a, int b)
{
return a + b;
}
main.cpp文件的代码(head.h头文件还没包含)
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout<<add(3, 5)<<endl;
return 0;
}
1) 以相对路径的方式直接包含头文件
为了能够使用add函数,必须包含add所在的头文件。 最简单的方法是直接在main.cpp文件中,用相对路径包含head.h文件.即 #include”function/head.h”。完整代码为
#include <iostream>
#include “function/head.h”
using namespace std;
int main(int argc, char *argv[])
{
cout<<add(3, 5)<<endl;
return 0;
}
此时,编译命令为 :$g++ main.cpp function/head.cpp -o main
这种用相对路径包含头文件的方式有很多弊端。当function目录改成其它名字,或者head.h文件放到其它目录了,这时都要对main.cpp文件进行修改,如果head.h头文件被很多其它文件包含的话,这个工作量就大多了。
2) 用编译选项 –I(大写i)
其实,可以想一下,为什么iostream文件不在当前目录下,就可以直接使用呢?这是因为,编译器会在一些默认的目录下(/usr/include,/usr/inlucde/c++/4.4.3等目录)搜索头文件。所以,iostream头文件不用添加。但我们不能每写一个头文件就放到那里。
知道了原理,现在来用一下一个编译选项 –I(include的缩写)用来告诉编译器,还可以去哪里找头文件。
使用这个编译命令,$g++ main.cpp function/head.cpp -Ifunction -o main
此时main.cpp文件写成