Путаница в путях к файлам, включенным в Xcode

Я пишу небольшую программу на C ++ на Xcode 5 для развлечения, но я впервые использую Xcode, и я не понимаю, как Xcode обрабатывает пути при открытии файлов, включенных в проект. Я использую фреймворк SDL2_image, и когда я хочу загрузить изображение, которое я включил в проект, я просто делаю это, и он находит изображение в порядке:

IMG_LoadTexture(renderer, "image_name.png");

Однако, похоже, это больше нигде не работает. Я пытаюсь загрузить файл xml с помощью libxml2, но этот код:

xmlDocPtr doc = xmlParseFile("doc_name.xml");

Просто приводит к этому:

I/O warning : failed to load external entity "doc_name.xml"

То же самое происходит, когда я пробую другие способы загрузки файлов. Я не уверен, что это потому, что фреймворк SDL2_Image делает что-то особенное, или потому, что у меня есть другое фундаментальное непонимание того, как все работает. Все файлы должны быть включены одинаково, я просто щелкнул правой кнопкой мыши по проекту и выбрал «Добавить файлы в ...». После компиляции они отображаются в папке «Contents / Resources» приложения. Я видел другие вопросы о stackoverflow о том, как открывать файлы в пакете (который, как я полагаю, является папкой с содержимым?), Но меня смущает, почему мне не нужно было делать ничего, что предлагают эти ответы, чтобы заставить его работать с материалом SDL_Image.

Буду очень признателен за любую помощь с этим. Я исправил все свои проблемы с помощью волшебных настроек сборки из Интернета, которых я не понимаю, поэтому любое объяснение, которое показывает, как я мог понять это для себя, чтобы в следующий раз я мог быть очень признателен.

[ОБНОВЛЕНИЕ] Если я использую путь «Application_Name.app/Contents/Resources/file_name», я могу получить доступ к файлу. Однако я не понимаю, почему я должен делать это со всем, кроме библиотеки SDL2_Image, и я не хочу, чтобы мои пути зависели от имени приложения.


person Mason    schedule 01.12.2013    source источник


Ответы (1)


Вариант 1) Думаю, проблема здесь не в коде C ++, а в расположении файла. В XCode двоичные программы создаются в папке исполняемых файлов. Вы должны настроить этапы сборки для копирования входного файла в расположение исполняемых файлов с помощью «Копировать ресурсы пакета». См. документацию Apple

Вариант 2) В качестве альтернативы вы можете работать с жестко запрограммированными путями и создать установщик, который быстро выполняется в bash, а запуск сценария может быть легко реализован в редакторе схемы XCode на каждом этапе.

Вариант 3) Используйте CoreFoundation и макрос компилятора следующим образом: Относительные пути не Работа в Xcode C ++

person Jeremiah Smith    schedule 01.12.2013
comment
Спасибо - к сожалению, по умолчанию там уже есть этап сборки Copy Bundle Resources со всеми файлами, к которым я пытаюсь получить доступ. Если это так, мне вообще не нужно менять это, не так ли? - person Mason; 01.12.2013
comment
Если он работает, все в порядке, поскольку я объяснил, что местоположение исполняемого файла является ключевым, в качестве альтернативы вы можете работать с жестко закодированными путями и создать установщик, который быстро выполняется в bash, а запуск сценария может быть легко реализован в редакторе схемы XCode. с каждой фазой. - person Jeremiah Smith; 02.12.2013
comment
Это работает в том смысле, что он помещает файлы в папку Contents- ›Resources скомпилированного приложения, но мой код по-прежнему не может найти файл. - person Mason; 02.12.2013
comment
Я добавил обновление к своему вопросу с дополнительной информацией внизу - person Mason; 02.12.2013
comment
Изменен ответ на макрос компилятора с CoreFoundation - person Jeremiah Smith; 02.12.2013
comment
Большое спасибо! Это исправило это для меня. Я часами возился с CoreFoundation / Foundation, пытаясь сделать именно то, что описывает этот ответ, вы просто избавили меня от большого разочарования. Я извиняюсь за неясность в моем первоначальном вопросе, теперь, когда я понимаю, в чем была проблема, я понимаю, что большая часть информации, которую я дал, не имеет отношения к делу. - person Mason; 02.12.2013