Вопрос

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

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

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

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

Итак, я считаю, что происходит то, что этот Mac Bundle меняет мой текущий каталог.

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

Спасибо!

Это было полезно?

Решение

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

Другие советы

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

#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; 

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top