Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Debian包结构中的程序访问资源 我已经制作了一个DEB包,我已经创建了一个C++应用程序。我希望此应用程序使用“data”目录中的资源,在我的测试中(为了方便起见),该目录与程序二进制文件位于同一位置,我通过其相对路径从代码内部调用它。在Debian操作系统中,有一些标准位置可以放入数据文件(比如/usr/share/…),还有一些位置可以放入二进制文件(可能是/usr/bin)。我不想在我的程序中硬编码路径,我认为通过“data/img.png”访问图像比通过“/usr/share/../data/img.png”更好。所有的GNU经典程序都尊重目录结构,我想他们做得很好。我试图用dpkg来找出应用程序的结构,但这对我没有帮助。我有没有更好的方法来做到这一点_C++_Linux_Debian_Deb - Fatal编程技术网

从Debian包结构中的程序访问资源 我已经制作了一个DEB包,我已经创建了一个C++应用程序。我希望此应用程序使用“data”目录中的资源,在我的测试中(为了方便起见),该目录与程序二进制文件位于同一位置,我通过其相对路径从代码内部调用它。在Debian操作系统中,有一些标准位置可以放入数据文件(比如/usr/share/…),还有一些位置可以放入二进制文件(可能是/usr/bin)。我不想在我的程序中硬编码路径,我认为通过“data/img.png”访问图像比通过“/usr/share/../data/img.png”更好。所有的GNU经典程序都尊重目录结构,我想他们做得很好。我试图用dpkg来找出应用程序的结构,但这对我没有帮助。我有没有更好的方法来做到这一点

从Debian包结构中的程序访问资源 我已经制作了一个DEB包,我已经创建了一个C++应用程序。我希望此应用程序使用“data”目录中的资源,在我的测试中(为了方便起见),该目录与程序二进制文件位于同一位置,我通过其相对路径从代码内部调用它。在Debian操作系统中,有一些标准位置可以放入数据文件(比如/usr/share/…),还有一些位置可以放入二进制文件(可能是/usr/bin)。我不想在我的程序中硬编码路径,我认为通过“data/img.png”访问图像比通过“/usr/share/../data/img.png”更好。所有的GNU经典程序都尊重目录结构,我想他们做得很好。我试图用dpkg来找出应用程序的结构,但这对我没有帮助。我有没有更好的方法来做到这一点,c++,linux,debian,deb,C++,Linux,Debian,Deb,PS:我还希望我的代码能够移植到Windows(跨平台),尽可能避免使用“if WIN32”之类的变通方法。这不完全是linux特定的或debian特定的。我认为is可能与Linux标准库或POSIX规范有关。我无法足够快地发现任何规范 但是对于每种类型的数据,您不应该使用一些“基本”目录和其中的子目录。平台相关代码应属于/usr/lib/programname,平台无关只读数据应属于/usr/share/programname/img.png。应用程序在/var/lib/programname

PS:我还希望我的代码能够移植到Windows(跨平台),尽可能避免使用“if WIN32”之类的变通方法。

这不完全是linux特定的或debian特定的。我认为is可能与Linux标准库或POSIX规范有关。我无法足够快地发现任何规范

但是对于每种类型的数据,您不应该使用一些“基本”目录和其中的子目录。平台相关代码应属于/usr/lib/programname,平台无关只读数据应属于/usr/share/programname/img.png。应用程序在/var/lib/programname/cache.db中更改的数据。或者~/.programname/cache.db,取决于它是什么类型的应用程序以及它的功能。注意:对于非可执行数据,/usr/share已经存在时,不需要“data”目录

您可能需要检查是否为Debian打包。但它不是像adroid、iphone或windows文件中那样的资源。这些文件在软件包安装到目标文件系统时被提取为真实文件

编辑:参见

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;
    }
#包括
#ifdef WIN32
#定义根前缀“c:/Program Files/”
const char DATA_PREFIX[]=根前缀“程序/数据”;
#否则
#定义根前缀“/usr/”
/*#定义根前缀“/usr/local/”*/
const char DATA_PREFIX[]=根前缀“share/program”;
#恩迪夫
std::字符串GetImageBasePath()
{
返回std::string(数据前缀)+“/images”;
}
std::string GetImagePath(const std::string和imagename)
{
//这里可以尝试多种目录和/或文件类型,这取决于复杂程度
//应该是。
//例如,您可以检查此处是否存在这样的文件,如果可以加载多个类型,则只返回确实存在的图像类型。
返回GetImageBasePath()+imagename+“.png”;
}
班级形象;
外部图像*加载图像(常量字符*路径);
int main(int argc,char*argv[])
{
Image*img1=LoadImage(GetImagePath(“工具箱”).c_str());
Image*img2=LoadImage(GetImagePath(“openfile”).c_str());
返回0;
}

进行类设置可能是明智的,您可以在每次启动时初始化一次依赖于平台的根路径,然后使用Settings::GetImagePath()作为方法。

在Debian软件包中,您确实应该在/usr/share/中安装数据。访问数据时,应使用,其中说明$XDG_data_DIRS是要搜索的数据目录的冒号分隔列表(此外,“如果$XDG_data_DIRS未设置或为空,则应使用等于/usr/local/share/:/usr/share/的值。”)。

我发现这非常有用,但我想为Windows编译相同的代码,不使用任何类型的“如果窗口”。我忘了在我的问题中提到这个。谢谢!我会检查链接。我编辑了我的问题,我忘了提到我希望在不使用任何“如果Windows”的情况下为Windows编译相同的代码。我看到了您发布的链接,它们详细解释了如何在Debian中打包,将每种文件放在何处,但我想他们假设您只为Linux编译程序,或者您正在从代码内部处理路径。