我对 .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
。
现在我似乎很困惑,因为根据我从哪里运行程序,它会给出不同的输出。谁能详细说明这种行为的原因,这是正常现象还是我犯了一些错误?
最佳答案
之所以如此,是因为(如 here 所述)编译器将搜索带有引号(而不是括号)的 #included
文件,当前工作目录是源文件的位置。
然后,当您尝试打开 .csv 文件时,现在是您的程序寻找文件。但是你的程序运行时当前工作目录是 myproject/
这解释了为什么你必须指定 data/file.csv
作为你的文件路径,而不是 ../数据/文件.csv
。您的程序不会在您的 src
文件夹中运行,它将在二进制文件最终被调用的目录中运行。
您可能已经注意到,在您的 Makefile 中,您的 -I 选项为您的头文件指定了一个不同于 .cpp 文件的路径。
编辑答案:其实很简单,完全正常。当您调用二进制文件时,您所在的目录就是当前工作目录。也就是说,如果您使用命令 ./myproject/bin/eval.out
运行它,当前工作目录是 . (例如 /home/the_user/cpp_projects
)。我的帖子对此有点误导,我更正了它。
注意:您可以在命令提示符中使用命令pwd
来了解该提示符的当前工作目录(pwd 代表“打印工作目录”)。
关于c++ - 用于#include 和其他文件的不同路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16604292/