[英]Accessing resources from program in Debian package structure
我已經創建了一個C ++應用程序的DEB包。 我希望該應用使用“數據”目錄中的資源,在我的測試中(為了方便起見),該目錄與程序二進制文件位於同一位置,我從代碼內部按其相對路徑對其進行調用。 在Debian OS中,存在將數據文件放入的標准位置(如/ usr / share / ...等),以及將二進制文件放入的其他位置(可能是/ usr / bin)。 我不想在程序中使用硬編碼的路徑,我認為通過“ data / img.png”訪問圖像比“ /usr/share/.../data/img.png”是一種更好的做法”。 所有GNU經典程序都尊重目錄結構,我想他們會很好地做到這一點。 我嘗試使用dpkg來查找應用程序的結構,但這沒有幫助。 我這樣做有更好的方法嗎?
PS:我也希望我的代碼可以移植到Windows(跨平台)中,從而避免使用“ if WIN32”之類的變通辦法。
這並不完全是特定於linux或特定於debian的。 我認為這可能與Linux Standard Base或POSIX規范有關。 我無法足夠快地發現任何規格。
但是,對於每種類型的數據,都不應在其中使用一些“基本”目錄和子目錄。 平台相關的代碼應屬於/ usr / lib / programname,平台無關的只讀數據應屬於/usr/share/programname/img.png。 應用程序在/var/lib/programname/cache.db中更改了數據。 或〜/ .programname / cache.db,取決於它是什么類型的應用程序以及它做什么。 注意:當/ usr / share已經存在不可執行數據時,則不需要“數據”目錄。
如果為Debian打包,則可能需要檢查http://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html 。 但這不是adroid或iphone或Windows文件中的資源。 這些文件在軟件包安裝時作為真實文件提取到目標文件系統中。
編輯:請參閱http://www.debian.org/doc/packaging-manuals/fhs/fhs-2.3.html
Edit2:至於多平台解決方案,我建議您做一些包裝功能。 在Windows上,它取決於安裝程序,通常程序通常在注冊表中具有指向其安裝目錄的路徑。 在Unix上,或多或少地給出了放置數據的位置,您可以考慮使用build選項來更改目標前綴,或使用環境變量覆蓋默認路徑。 在Windows上,如果前綴不是太靈活,那么前綴就足夠了。
我建議一些函數,您將在其中傳遞對象名稱,它們將返回文件的路徑。 這取決於所使用的工具包,Qt庫可能已經實現了類似的功能。
#include <string>
#ifdef WIN32
#define ROOT_PREFIX "c:/Program Files/"
const char DATA_PREFIX[] = ROOT_PREFIX "program/data";
#else
#define ROOT_PREFIX "/usr/"
/* #define ROOT_PREFIX "/usr/local/" */
const char DATA_PREFIX[] = ROOT_PREFIX "share/program";
#endif
std::string GetImageBasePath()
{
return std::string(DATA_PREFIX) + "/images";
}
std::string GetImagePath(const std::string &imagename)
{
// multiple directories and/or file types could be tried here, depends on how sophisticated
// it should be.
// you may check if such file does exist here for example and return only image type that does exist, if you can load multiple types.
return GetImageBasePath() + imagename + ".png";
}
class Image;
extern Image * LoadImage(const char *path);
int main(int argc, char *argv[])
{
Image *img1 = LoadImage(GetImagePath("toolbox").c_str());
Image *img2 = LoadImage(GetImagePath("openfile").c_str());
return 0;
}
進行設置類設置可能是明智的,您可以在其中每次啟動一次初始化與平台相關的根路徑,然后使用Settings :: GetImagePath()作為方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.