【发布时间】:2010-02-04 20:03:51
【问题描述】:
我正在运行一个 GLFW 应用程序(我用 C++ 编写的)
我运行如下:
./prog.app/Contents/MacOS/prog # from the command line
但是,我的代码无法正确读取相对路径文件。
所以我相信这个 Mac Bundle 正在改变我的当前目录。
1) 把它改成什么? 2) 我可以控制吗?
谢谢!
【问题讨论】:
我正在运行一个 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 上,它在初始化期间会显式更改当前目录。 Look here 并向下滚动到大约第 236 行(或搜索 chdir)。
我找到了您的 SO 问题,因为我目前正试图了解 GLFW 为什么在初始化期间执行显式 chdir。我发现这一点是因为我有一个可以在除 OSX 之外的所有平台上运行的程序。在 OSX 上,它无法使用相对路径找到它的数据文件。我的临时解决方案是在main启动时获取当前目录,并在初始化GLFW后重置当前目录。
【讨论】: