Относительные файлы на C++

Я пытаюсь открыть несколько шейдеров openGL в своем приложении на C++. Мое приложение разделено на два уровня абстракции: графический движок (который использует openGL) и фактическая логика приложения. Я хочу, чтобы графический движок был как можно более пригодным для вторичной переработки [1] (для других проектов).

Проблема в том, что если я определяю путь к файлу шейдера относительно (например, #define FOO_FRAG_SHADER "shaders/foo.frag"), программа не сможет его найти, поскольку этот каталог относится к пути графического движка, а не к пути приложения. По причине, указанной выше [1], я действительно не хочу указывать его каталог относительно каталога приложения, поскольку он становится зависимым от приложения.

Поэтому у меня вопрос: есть ли способ указать каталог относительно файла, который его определяет?

Есть ли способ указать каталог относительно файла, который указывает его, а не исполняемого файла? Он не должен иметь отношения к исполняемому файлу.
drescherjm 14.12.2018 20:23

Относительные пути к каталогам относятся к рабочему каталогу программы, из которого вы его запускаете, а не к месту, где на самом деле находится исполняемый файл.

πάντα ῥεῖ 14.12.2018 20:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
271
1

Ответы 1

Относительные пути разрешаются относительно рабочий каталог процесса, который не обязательно является местоположением самого исполняемого файла. Например, если вы запустите свою программу вот так

/user/oier/bin/> ./a.out

тогда относительные пути разрешаются относительно /user/oier/bin. Однако, если вы начнете так

/user/oier/> bin/a.out

тогда относительные пути разрешаются относительно /user/oier.

Есть два распространенных подхода к решению этой проблемы без жесткого программирования расположения ваших файлов:

  • Передайте параметр командной строки, определяющий базовый путь для графического движка, или
  • Используйте переменную среды, чтобы указать расположение графического движка

Если файлы, о которых идет речь, небольшие, и есть вероятность, что каждое приложение может захотеть предоставить его частную копию, третий подход состоит в том, чтобы скопировать соответствующие файлы в папку в bin вашего приложения и использовать относительную ссылку на основе о местонахождении копии.

Посмотрим, правильно ли я понял ваше решение (второе выглядит разумным). Я посмотрел, как ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ работают в C++. Итак, перед выполнением кода мне нужно установить переменную среды, указывающую путь шейдеров. Например: user@mySystem:$ FOO_APP_SHADERS=whatever/someotherdir/shaders, тогда мне нужно запросить его на моем графическом движке с getenv(), чтобы, добавив в конце "/foo.frag", я мог получить доступ к файлу

oierlauzi 14.12.2018 20:49

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

drescherjm 14.12.2018 21:10

@oierlauzi Верно, это подход. Большинство систем позволяют вам определять переменные среды как часть своего рода сценария запуска для каждого пользователя / системы, поэтому вам придется настроить FOO_APP_SHADERS один раз во время установки вашей библиотеки.

Sergey Kalinichenko 14.12.2018 21:17

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