Что такое `pwd` приложения для Mac? - PullRequest
4 голосов
/ 04 февраля 2010

Я использую приложение GLFW (которое я написал на C ++)

Я запускаю его следующим образом:

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

Однако мой код не может правильно читать файлы с относительными патчами.

Так что я верю, что этот Mac Bundle меняет мой текущий каталог.

1) на что это меняет? 2) я могу это контролировать?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 05 февраля 2010

Вы можете использовать этот фрагмент кода, чтобы узнать местоположение прог.

#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; 
2 голосов
/ 04 февраля 2010

Часто это домашний каталог пользователя. Я не уверен, гарантировано ли это, но вы можете использовать chdir () в приложениях Cocoa. В зависимости от ваших требований пользователи могут лучше работать, если вы используете закладки файловой системы (10.6+) или псевдонимы (ранее). Или даже абсолютные пути, которые все еще устойчивы к изменению рабочего каталога.

1 голос
/ 05 февраля 2010

Никогда не делайте предположений о текущем рабочем каталоге при запуске вашего приложения. Программа Finder достаточно последовательна в этом, но это не единственный способ запустить приложение. Например, при отладке в Xcode начальный рабочий каталог будет другим, и существуют различные другие методы, которые могут или не могут установить рабочий каталог должным образом. Вы должны протестировать свое приложение, запустив его из командной строки в совершенно не связанной директории - если оно все еще находит свои файлы в этом состоянии, то вы в хорошей форме.

0 голосов
/ 24 марта 2011

Если вы посмотрите на источники GLFW, вы увидите, что в OSX во время init он явно изменяет текущий каталог. Посмотрите здесь и прокрутите вниз до строки 236 (или найдите chdir).

Я нашел ваш SO вопрос, потому что я сейчас пытаюсь понять, почему GLFW делает явный chdir во время init. Я обнаружил это, потому что у меня есть программа, которая работает на всех платформах, кроме OSX. В OSX он не может найти свои файлы данных, используя относительный путь. Мое временное решение - получить текущий каталог при запуске main и сбросить текущий каталог после инициализации GLFW.

...