#include和其他文件使用不同的路径
Different paths used for #include and other files
我对我的。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代表"打印工作目录")。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 错误 LNK1104:错误消息中显示的路径未在其他依赖项中定义
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- 如何将用于创建文件的文件的路径提供给C++中的其他文件夹
- 共享库依赖于具有硬编码路径的其他库
- 在“其他包含目录”中添加的路径相对于什么
- 如何将路径存储在这种结构中,以及如何将其转换为其他内容
- 使用邻接矩阵的 Dijkstra 算法找不到从每个节点到每个其他节点的正确距离/路径
- #include和其他文件使用不同的路径
- 路径笔画算法(转换为三角形/四边形)或其他建议