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

标签 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

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

最佳答案

之所以如此,是因为(如 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/

相关文章:

c++ - Windows 安全模式运行简单程序(至少)快 3 倍?

c++ - 如何忽略字符数组中的某些字母和空格

ubuntu - makefile 的配方中的前导 "@"是什么

c++ - 为什么在 : foo x( (bar()) ); 这样的构造函数调用中需要双括号

c++ - 我可以将方法转换为 LPTHREAD_START_ROUTINE 吗?

c - Makefile 没有制作所有目标

c - 如何使用生成文件选项在 Visual Studio 2005 中链接 *.c 文件?

c - 低估一个非常小的 GNU makefile

c++ - Eigen 矩阵右除等价

linux - 即使存在 .config 也使内核提示配置选项