【发布时间】:2020-11-11 11:49:41
【问题描述】:
我有一个非常奇怪的问题。设置如下:
库 A 使用库 B
两个库都作为共享库独立安装,A 使用 CMake 包链接到 B。
当我创建一个直接链接到 B 的可执行文件时,一切正常。 但是,当我创建一个链接到 A 的可执行文件(使用 B)时,由于某种原因,我在 B 中的 fstream 无法打开特定文件。我 100% 确定该文件存在,不需要授权且当前未使用。 strerror(errno) 抛出的错误是“No such file or directory”。
我真的不知道会出什么问题。这是我用来打开的代码sn-p:
ifstream f;
f.open(filename.c_str(), ios_base::in|ios::binary);
if (f.fail()) {
std::cout << "Opening Vocabulary failed: " << std::strerror(errno) << std::endl;
return false;
}
我三次检查了文件名中的路径是否正确。这些是我能想到的最后手段:
- 也许库 A 使用另一个 C++ 标准作为 B,这就是对 fstream 的调用失败的原因?
- 也许文件名字符串以某种方式损坏,即使路径似乎是正确的?
- 也许一些内存泄漏损坏了我的 c_str() 命令?
还有什么我可以检查的吗?
编辑:啊,我忘记了一件事:fstream 命令位于头文件的模板函数中。也许这与它有关?
Edit2:这是堆栈跟踪。 “ORBVoc.bin”是我要打开的文件。我从中得到的唯一信息是,它不存在……尽管它确实存在。
https://www.file-upload.net/download-14359408/strace.log.html
【问题讨论】:
-
std::cout << filename在if (f.fail())中打印正确的文件名吗?filename是什么?它是如何通过的? -
如果是在linux下,运行
strace下的可执行文件,看看会发生什么。 -
@Evg: filename 打印正确的绝对路径。文件名是一个 std::string 并且由 const & 传递。
-
此问题显示的代码不符合 stackoverflow.com 对 minimal reproducible example 的要求。这意味着这里的任何人都不太可能最终回答这个问题。但最多只能猜测。你应该edit你的问题来展示一个最小的例子,不超过一两页代码(“最小”部分),其他人都可以剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
-
所以,好吧,我们无能为力。您的内核告诉您该文件不存在但您说它存在 - 我会相信您的内核。可能是您的进程无权访问任何目录或文件。或者文件不存在。