用于#include和其他文件的不同路径

时间:2013-05-17 08:04:56

标签: c++ makefile

我对.cpp项目的这种奇怪行为感到很困惑。我有以下文件夹结构:

include/mylib.h
myproject/src/eval.cpp
myproject/data/file.csv
myproject/Makefile

在eval.cpp中我包含mylib.h,如下所示:

#include "../../include/mylib.h"

并通过Makefile编译:

all:
     g++ -I include ../include/mylib.h src/eval.cpp -o eval.out

现在在我的eval.cpp中,我正在从数据目录中读取file.csv,如果我像这样引用它

../data/file.csv

它找不到它(一直得到空行),但是这个

data/file.csv

工作正常。

因此,要包含mylib.h,它会向上(从src文件夹)两个目录,这似乎是正确的。但是对我来说,从同一段代码中引用另一个文件它是假定我们在项目目录中没有意义。我想它以某种方式与Makefile连接,但我不确定。

为什么会这样?

编辑:经过一些尝试后,我尝试使用的路径似乎不是从二进制位置到数据位置的路径,而是依赖于来自我也运行二进制文件。即,如果我在bin目录中有二进制文件并运行它:

./bin/eval.out

适用于data/file.csv

此:

cd bin
./eval.out

适用于../data/file.csv

现在对我来说似乎很困惑,因为根据我运行程序的位置会给出不同的输出。任何人都可以详细说明这种行为的原因,如果这是正常的,或者我犯了一些错误?

1 个答案:

答案 0 :(得分:2)

之所以如此(因为解释here),编译器将使用引号(不带括号)搜索#included文件,当前工作目录是源文件的位置。

然后,当您尝试打开.csv文件时,它现在是您的程序,它会查找文件。但是,您的程序在当前工作目录为myproject/的情况下运行,这解释了为什么必须将data/file.csv指定为文件路径,而不是../data/file.csv。您的程序不在src文件夹中运行,它将在二进制文件最终被调用的目录中运行。

您可能已经注意到,在Makefile中,-I选项为头文件指定的路径与.cpp文件不同。

编辑答案:实际上非常简单,完全正常。调用二进制文件时,您所在的目录是当前工作目录。也就是说,如果使用命令./myproject/bin/eval.out运行它,则当前工作目录为。 (例如/home/the_user/cpp_projects)。我的帖子有点误导,我纠正了它。

注意:您可以在命令提示符中使用命令pwd来了解此提示的当前工作目录(pwd代表“打印工作目录”)。