什么是Mac捆绑应用程序的`pwd`?

时间:2010-02-04 20:03:52

标签: macos path pwd

我正在运行一个GLFW应用程序(我用C ++编写)

我按如下方式运行:

./prog.app/Contents/MacOS/prog # from the command line

但是,我的代码无法正确读取相对文件。

所以我相信正在发生的事情是这个Mac Bundle正在改变我当前的目录。

1)它改变了什么? 2)我可以控制吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用这段代码找出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; 

答案 1 :(得分:2)

通常它是用户的主目录。我不确定这是否有保证,但你可以在Cocoa应用程序中使用chdir()。根据您的要求,如果您使用文件系统书签(10.6+)或别名(较早),用户可能会有更好的体验。甚至是绝对路径,它们仍然可以防止更改工作目录。

答案 2 :(得分:1)

启动应用时,不要对当前工作目录做任何假设。 Finder对此非常一致,但它并不是启动应用程序的唯一方法。例如,在Xcode下调试时,初始工作目录会有所不同,并且有各种其他方法可能会或可能不会按预期设置工作目录。您应该通过在完全不相关的目录中从命令行启动它来测试您的应用程序 - 如果它仍然在这种情况下找到它的文件,那么您的状态良好。

答案 3 :(得分:0)

如果查看GLFW源代码,您会在init期间看到它在OSX上显式更改当前目录。 Look here并向下滚动到第236行(或搜索chdir)。

我找到了你的SO问题,因为我目前正试图理解为什么GLFW在init期间做了一个明确的chdir。我发现这是因为我有一个程序可以在除OSX之外的所有平台上运行。在OSX上,它无法使用相对路径找到它的数据文件。我的临时解决方案是在main启动时获取当前目录,并在初始化GLFW后重置当前目录。