В моей среде GNU / Linux мое программное обеспечение будет иметь все свои графические ресурсы, установленные под /usr/share/pixmaps
, В Wintendo все пошло бы на C:\Program files\myappname
, В другой ОС, где-то еще.
Каковы наиболее распространенные способы, соглашения, передовые практики, чтобы я мог абстрагироваться от ссылок на файлы, которые я открываю в своем коде, независимо от пути / установки / сборки? В основном это портативный способ ссылки на пути к ресурсам.
Создать препроцессор ifelse
цепочка ОС определяет, что #defines
имя функции, сопоставленное с реальным вызовом функции, который получает правильный путь:
#if _WIN32
#define GetResourcesFolderString GetResourcesFolderStringW
#elif ((macintosh) || (Macintosh) || (__APPLE__ & __MACH__))
#define GetResourcesFolderString GetResourcesFolderStringM
#elif __gnu_linux__
#define GetResourcesFolderString GetResourcesFolderStringU
//...and so on
#endif
//...Later...
std::string GetResourcesFolderStringW() {
return "C:/Program files/myappname/"}
std::string GetResourcesFolderStringM() {
return "Mac folder path here";
}
std::string GetResourcesFolderStringU() {
return "/usr/share/pixmaps/";
}
Таким образом, вы вызываете только одну функцию, и в зависимости от цели сборки вызывается правильная функция без изменений в коде.
Жесткое кодирование путей, как правило, не очень хорошая идея и используется здесь только в целях иллюстрации. Вероятно, вам следует настроить файл конфигурации или аналогичный, чтобы отдельные системы могли иметь отдельные пути установки и при этом иметь возможность находить ресурсы.
Других решений пока нет …