2016-06-24 2 views
0

Работа с приложением mac C++ в Xcode. Когда я нажимаю кнопку запуска, все в порядке (режим отладки и выпуска). Но когда я вхожу в finder в папку Products/Release и дважды щелкаю по .app напрямую, приложение немедленно закрывается с ошибкой (приложение неожиданно завершает работу, нажмите отчет, чтобы увидеть более подробную информацию). Когда я нажимаю отчет, строка кода, которую он вызывает на , кажется, чтобы указать, что он не находит мои файлы ресурсов, но он находит их прекрасными, когда я строю/запускаю то же самое точное приложение от xcode. Вот пример того, как я использую файлы ресурсов в коде:Приложение отлично работает при построении из Xcode, не будет запускаться непосредственно из .app

std::ifstream file; 
file.open("AppName.app/Contents/Resources/Saves/1.svd"); 
//do stuff 
file.close(); 

Кто-нибудь есть какие-либо идеи, почему дважды щелкнув .app, что Xcode только что создали бы иные результаты, чем запустить его из Xcode?

также не уверен, что это часть проблемы, но кажется странным, что мне нужно ссылаться на папку ресурсов вне файла .app (AppName.app/Contents/Resources/Saves/1.svd). Я ожидал бы, что этот путь будет относительно исполняемого файла в .app/Contents/MacOS, как это (../Resources/Saves/1.svd), но это тоже не сработало.

+0

Текущий каталог может отличаться при использовании Xcode и при явном изменении его в Finder. –

+0

@BoPersson Я не уверен, что понимаю, не могли бы вы объяснить, что вы имеете в виду в текущем каталоге? Чтобы уточнить, я не перемещаю файл .app в другую папку, а затем дважды щелкаю по нему, я перехожу в папку, которую xcode создает, когда я нажимаю кнопку запуска и нажимаю на .app, который он только что создал. или вы говорите, что «текущий каталог» - это параметр, который мне нужно изменить где-нибудь? – Dylan

+0

закончил тем, что запустил его, просто установив абсолютный путь к файлам (я пошел вперед и предположил, что файл .app находится в/Applications), как предлагается здесь: http://stackoverflow.com/questions/26161144/differences- между-running-osx-app-from-finder-versus-xcode, однако, id все еще любит знать, как сделать это более стабильным способом, который не предполагает, что .app находится в определенном месте на компьютере. если кто-нибудь это знает, хотел бы знать, как это сделать. спасибо – Dylan

ответ

0

У меня была схожая проблема и потратили некоторое время на изучение разных вариантов. Я закончил использование объектов Apple. Мне нужно было получить папку ресурсов:

#ifdef __APPLE__ 
#include "CoreFoundation/CoreFoundation.h" 
#endif 

Тогда фактическая сниппет:

#ifdef __APPLE__ 

char path[FILENAME_MAX]; 

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); 

if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)){ 
    // 
    //log("CFURLGetFileSystemRepresentation returned false. Path:%s", path); 
    exit(0); 
} 
CFRelease(resourcesURL); 

chdir(path); 

//log("Current path:%s", path); 
#endif 
+0

спасибо! им получать ошибки линкера, хотя при использовании этой – Dylan

+0

Неопределенных символов для архитектуры x86_64: "_CFBundleCopyResourcesDirectoryURL", ссылочные из: Files :: changeDirectoryToResourcesFolder() в files.o "_CFBundleGetMainBundle", ссылочные из: Files :: changeDirectoryToResourcesFolder() в files.o "_CFRelease", ссылки из: Files :: changeDirectoryToResourcesFolder() в files.o "_CFURLGetFileSystemRepresentation", ссылки из: Files :: changeDirectoryToResourcesFolder() в files.o л.д.: символ (ы) не найдено для архитектуры x86_64 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 – Dylan

+0

есть фреймворк или somethig n где-то мне нужно включить, чтобы использовать их? – Dylan