2

作成した C++ アプリの DEB パッケージを作成しました。このアプリで "data" ディレクトリのリソースを使用する必要があります。このディレクトリは、私のテストでは (便宜上)、プログラム バイナリと同じ場所にあり、コード内から相対パスで呼び出します。Debian OS には、データ ファイルを配置する標準的な場所 (/usr/share/... など) と、バイナリを配置する別の場所 (おそらく /usr/bin) があります。プログラムにパスをハードコーディングしたくありません。「/usr/share/.../data/img.png」よりも「data/img.png」で画像にアクセスする方が良いと思います。 "。すべての GNU クラシック プログラムはディレクトリ構造を尊重しており、適切な方法でそれを行っていると思います。アプリの構造を調べるために dpkg を使用しようとしましたが、役に立ちませんでした。より良い方法はありますか?

PS: また、コードを Windows (クロスプラットフォーム) に移植できるようにして、「if WIN32」などの回避策をできるだけ使用しないようにしたいと考えています。

4

2 に答える 2

1

これは完全にLinux固有またはDebian固有ではありません。LinuxStandardBaseや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では、データの場所が多かれ少なかれ指定されています。ターゲットプレフィックスを変更するためのビルドオプションを検討するか、環境変数を使用してデフォルトパスを上書きすることができます。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()を使用することをお勧めします。

于 2013-03-11T13:51:37.597 に答える
1

Debianパッケージでは、実際にデータを/ usr /share/にインストールする必要があります。データにアクセスするときは、XDG標準を使用する必要があります。この標準では、$ XDG_DATA_DIRSは、検索するデータディレクトリのコロンで区切られたリストです(また、「$ XDG_DATA_DIRSが設定されていないか空の場合、値は/ usr / localになります)。 / share /:/ usr / share /を使用する必要があります。」)。

于 2013-03-11T13:52:58.640 に答える