簡體   English   中英

從Debian軟件包結構中的程序訪問資源

[英]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()作為方法。

在您的Debian軟件包中,您確實應該將數據安裝在/ usr / share /中。 訪問數據時,應使用XDG標准 ,該標准指出$ XDG_DATA_DIRS是用冒號分隔的數據目錄列表,以供搜索(此外,“如果$ XDG_DATA_DIRS未設置或為空,則該值等於/ usr / local / share /:/ usr / share /。”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM