我正在运行一个 GLFW 应用程序(我用 C++ 编写的)
我按如下方式运行它:
./prog.app/Contents/MacOS/prog # from the command line
但是,我的代码无法正确读取相对路径文件。
所以我相信正在发生的事情是这个 Mac Bundle 正在改变我的当前目录。
1)它把它改成什么?2)我可以控制这个吗?
谢谢!
通常它是用户的主目录。我不确定这是否得到保证,但您可以在 Cocoa 应用程序中使用 chdir() 。根据您的要求,如果您使用文件系统书签(10.6+)或别名(更早版本),用户可能会获得更好的体验。甚至是绝对路径,它们仍然可以抵抗更改工作目录。
您也许可以使用这段代码来找出 prog 的位置。
#include <mach-o/dyld.h>
char exe_path[MAXPATHLEN];
char link_path[MAXPATHLEN];
uint32_t size = sizeof(exe_path);
if (_NSGetExecutablePath(exe_path, &size) != 0)
assert();
if (realpath(exe_path, link_path) == 0)
assert();
return link_path;
启动应用程序时,切勿对当前工作目录做出任何假设。Finder 在这一点上是相当一致的,但它不是启动应用程序的唯一方式。例如,在 Xcode 下调试时,初始工作目录会有所不同,并且还有各种其他方法可能会或可能不会按预期设置工作目录。您应该通过在完全不相关的目录中从命令行启动它来测试您的应用程序 - 如果在这种情况下它仍然找到它的文件,那么您的状态良好。
如果您查看 GLFW 源代码,您会在 OSX 上看到它在 init 期间显式更改当前目录。 看这里并向下滚动到第 236 行(或搜索 chdir)。
我找到了您的 SO 问题,因为我目前正在尝试了解 GLFW 为什么在初始化期间执行显式 chdir。我发现这一点是因为我有一个可以在除 OSX 之外的所有平台上运行的程序。在 OSX 上,它无法使用相对路径找到它的数据文件。我的临时解决方案是在 main 启动时获取当前目录,并在初始化 GLFW 后重置当前目录。