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

Different paths used for #include and other files

本文关键字:路径 其他 文件 #include      更新时间:2023-10-16

我对我的。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中我从data目录中读取file。csv如果我像这样引用它

../data/file.csv

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

data/file.csv

工作好。

所以,要包含mylib.h,它要从src文件夹上升两个目录,这似乎是正确的。但是对我来说,从同一段代码中引用另一个文件是没有意义的,它假设我们在项目目录中。我想它是连接与Makefile不知何故,但我不确定。

为什么会这样?

EDIT:经过几件事,我尝试了似乎所使用的路径不是从二进制位置到数据位置的路径,而是取决于我运行二进制文件的位置。例如,如果我在bin目录下有二进制文件,并像这样运行它:

./bin/eval.out

data/file.csv兼容

:

cd bin
./eval.out

适用于../data/file.csv

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

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

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

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

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

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

相关文章: