2012-07-02 2 views
3

Я пытаюсь загрузить некоторые изображения в базовую программу на основе C++/SDL. Изображения загружаются с использованием SDL_LoadBMP. У меня есть загрузка изображения, и все работает отлично. Моя проблема в том, что изображение загружается относительно того, из которого я вызываю программу.Загрузка изображений относительно двоичного файла

Итак, у меня есть структура каталогов, которая выглядит примерно так.

project/ 
    src/ 
     source.cpp 
    assets/ 
     image.bmp 
    bin/ 
     program 

Когда я выполнить программу из каталога проекта (./bin/program) он должен использовать путь assets/image.bmp для загрузки изображения. Есть ли способ, которым я могу использовать относительный путь ../assets/image.bmp, чтобы программа могла выполняться из любого места?

Я думаю, что мне нужно что-то, что обеспечивает абсолютный путь к программе, к которой я могу добавить свои пути.

ответ

3

В Linux /proc/self/exe является символической ссылкой на исполняемый файл текущего процесса. Таким образом, вы можете использовать readlink, чтобы найти его путь. Оттуда вы можете использовать обычную манипуляцию с путями, чтобы найти свои ресурсы. Возможно, вы должны учитывать случай, когда исполняемый файл программы снова является символической ссылкой на место, где находится ваш двоичный файл, т. Е. Сделать еще несколько ссылок, пока текущий путь является символической ссылкой.

Когда-то возникал вопрос о finding current executable's path without /proc/self/exe, который также спрашивал о портативном интерфейсе, но ни одно решение, удовлетворяющее всем потребностям, не было дано в принятом ответе.

+0

Вау, я не думал, что это будет так сложно. Таким образом, простой относительный путь, такой как '../ path' или'./Path', не будет делать? Думаю, мне нужно будет построить или найти хорошую функцию, которая будет работать в большинстве мест. Я нацелен на Linux, но хотел бы иметь возможность перекрестного компиляции позже. – Olical

+0

А как насчет 'basename'? Любая причина, почему это не должно использоваться? http://stackoverflow.com/a/1019557/455137 – Olical

+0

Относительный путь всегда относится к текущему рабочему каталогу, который может быть полностью не связан с каталогом, в котором находится ваш двоичный файл. Если вы в основном ориентированы на Linux, читайте также [раздел 1.14 часто задаваемых вопросов по программированию Unix] (http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC23). Он не рекомендует использовать двоично-относительные пути. – MvG

2

В Windows:

  1. GetModuleFileName(NULL, ... получает вам полный путь к двоичным
  2. PathRemoveFileSpec(... оставляет вам каталог только
  3. PathCombine(..., _T("..\\..\\image.bmp")) с результатом пункта 2 выше, получает вам полный путь к изображению
Смежные вопросы