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
在GNU/Linux系统上,我应该从哪里加载应用程序数据?_Linux_Autoconf_Glade - Fatal编程技术网

在GNU/Linux系统上,我应该从哪里加载应用程序数据?

在GNU/Linux系统上,我应该从哪里加载应用程序数据?,linux,autoconf,glade,Linux,Autoconf,Glade,在本例中,我将c与autoconf一起使用,但问题适用于其他地方 我有一个运行时需要的gladexml文件,我必须告诉应用程序它在哪里。我正在使用autoconf在代码中定义一个变量,该变量指向“指定的前缀目录”/app name/glade。但这只有在安装应用程序后才能开始工作。如果我想在那一点之前运行程序呢?是否有一种标准的方法来确定应用程序数据应检查哪些路径 谢谢 谢谢你的回复。为了澄清,我不需要知道应用程序数据安装在哪里(例如通过在/usr、usr/local等中搜索),configu

在本例中,我将c与autoconf一起使用,但问题适用于其他地方

我有一个运行时需要的gladexml文件,我必须告诉应用程序它在哪里。我正在使用autoconf在代码中定义一个变量,该变量指向“指定的前缀目录”/app name/glade。但这只有在安装应用程序后才能开始工作。如果我想在那一点之前运行程序呢?是否有一种标准的方法来确定应用程序数据应检查哪些路径

谢谢



谢谢你的回复。为了澄清,我不需要知道应用程序数据安装在哪里(例如通过在/usr、usr/local等中搜索),configure脚本就可以做到这一点。问题更多的是确定应用程序是否已经安装。我想我将首先签入安装位置,如果没有签入,则签入“/src/foo.glade”。

如果程序是全局安装的:

/usr/share/app-name/glade.xml /usr/share/app name/glade.xml
如果您想让程序在未安装的情况下工作(即只提取一个tarball),请将其放入程序目录。

我认为没有任何标准方法可以找到此类数据

我个人会这样做,我会有一个路径列表,我会找到是否可以从这些路径中的任何一个找到文件,并且列表应该包含从autoconf定义的DATADIR+APPNAME和CURRENTDIRECTORY+可能的\u前缀,其中前缀可能是来自构建根目录的某个文件夹


但是在任何情况下,不要忘记使用autoconf中的定义来定义数据文件,这些定义使软件更易于打包(如deb/rpm)

我认为没有一种标准的文件放置方式。我将其构建到程序中,并且我不会将其限制在一个位置

这取决于需要对配置文件进行多少自定义

我首先构建一个默认目录列表,然后遍历它们,直到找到glade.xml的一个实例并停止查找,或者找不到它并以错误退出。默认列表的最佳候选项是/etc、/usr/share/app name、/usr/local/etc


如果文件被设计为可自定义的,在我查看默认目录之前,我有一个用户文件和路径的列表,并对它们进行处理。如果找不到其中一个用户版本,那么我会查看默认目录列表。用户配置文件的最佳候选文件是~/.glade.xml或~/.app name/glade.xml或~/.app name/.glade.xml。

一般来说,没有规定应该如何执行,但Debian打包程序通常将应用程序数据安装在/usr/share、/usr/lib等位置。他们还可以修补软件,使其从适当的位置读取。有关更多信息,请参见

不过,我可以说几句我是如何做到这一点的。首先,我不希望在单个目录中找到该文件;我首先创建一个目录列表,在我的包装器中围绕
fopen()
遍历这些目录。我认为文件读取的顺序如下:

  • 当前目录(显然)
  • ~/.程序名
  • $(datadir)/程序名
$(datadir)
是一个可以在Makefile.am中使用的变量。例如:

AM_CPPFLAGS = $(ASSERT_FLAGS) $(DEBUG_FLAGS) $(SDLGFX_FLAGS) $(OPENGL_FLAGS) -DDESTDIRS=\"$(prefix):$(datadir)/:$(datadir)/program-name/\"
这当然取决于
configure
的输出以及
configure.ac
的外观

因此,只需制作一个包装器,它将遍历这些位置并从这些dir中获取数据。类似于
PATH
变量的东西,除非您实现了迭代


在写了这篇文章之后,我注意到我需要在中清理我们的实现,但这可以作为一个很好的开始。看看我们的
Makefile.am
如何使用
$(datadir)
,看看我们的
util.cpp
util.h
如何使用一个简单的包装器(
yatc_fopen()
)。我们还有
yatc_find_file()
,以防某些第三方库正在执行
fopen()
ing操作,如SDL_image或libxml2。

大多数发行版不允许其软件包在~folder中安装任何内容。在多用户主机中,您可能会占用磁盘空间,并导致大量解析和访问问题。但是,我没有注意到您提到了“可自定义”部分,那么显然唯一的位置是~=)不,autoconf允许您在构建时指定任何安装目录,因此位置必须来自autoconf。使用这样的固定路径是一个坏主意。@Daedalus:我的意思是如果你从软件包中安装了它。即使使用autoconf,默认情况下路径也应该是这样的(假设您将前缀设置为/usr)。但我认为$(datadir)/程序名应该在当前目录之前完成,以防有类似的文件存在。想象一下,如果您执行了
sudofoo
,foo首先检查了本地目录中的某个文件。。。结果可能是灾难性的!