0

我对我的 .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.

现在对我来说似乎很困惑,因为取决于我从哪里运行程序会给出不同的输出。谁能详细说明这种行为的原因,如果这是正常的还是我犯了一些错误?

4

1 回答 1

2

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

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

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

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

注意:您可以pwd在命令提示符中使用该命令来知道哪个是该提示符的当前工作目录(pwd 代表“打印工作目录”)。

于 2013-05-17T08:23:13.317 回答