Linux上的可执行文件如何知道获取数据文件的位置?

时间:2010-03-15 01:48:38

标签: c linux

Linux上的程序将程序的数据安装到$PREFIX/share/programname,程序如何知道它在哪里,是否需要编译?

是否适合假设二进制文件位于$PREFIX/bin,并使用它来确定$PREFIX

这只需要在Linux上工作,具体来说,我正在使用C。

4 个答案:

答案 0 :(得分:2)

完全取决于该计划。常见的模式是将PREFIX定义为预处理程序指令。 GNU autoconf具有标准名称,允许在配置时覆盖它们。

答案 1 :(得分:1)

正如p00ya指出的那样,这取决于该计划。我会说大多数程序都有编译时默认值,有些程序还使用环境变量来定位它们的数据文件;如果您没有分发软件的源代码并且您不希望管理员或软件包维护者为其系统重新编译它,那么环境变量技术可以很方便。如果您计划使用环境变量,则应该在安装时生成具有正确路径的包装脚本,或者为您的用户提供适当的指令(即添加到其shell init脚本的内容)。

答案 2 :(得分:1)

让我们假设:

  

您正在编译程序foo   需要libfoo的版本   比新提供的更新   系统。你缺乏足够的特权   升级系统libfoo,   此外,该计划想要   将文件存入/ etc,在哪里   没有写作的许可。怎么样   你可以编译和安装   程序

大多数构建配置软件提供的不仅仅是--prefix,许多构建软件使您能够指定系统配置位置(--sysconfdir),默认情况下查找共享库的位置({{ 1}}),存放已编译的可执行文件(--libdir)和其他“一体化”快捷方式的位置,例如--bindir

事实上:

--datarootdir

如果程序实际上正在使用构建系统配置工具,它允许您微调指示构建过程的每个旋钮。例如,您可能希望--prefix为/ home,但是在/ usr / share中的某个位置使用自定义版本的libfoo中的某个位置,root用户已经为无法使用系统版本的用户存放了这些版本。

当程序为tpost@tpost-desktop:~/Desktop/oss-projects/srce/srce.hg$ ./configure --help `configure' configures SRCE 1.0.9 to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local' using `--prefix', for instance `--prefix=$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/srce] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] Optional Features and Packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --enable-unsafe enable unsafe operation [default=no] --with-user specify the system user [default=root] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to <foo@foo.com>. 时,这些路径中的一些是设置的,不仅仅是编译,而是它们是生成的ELF对象的一部分。以纯文本形式安装的其他文件(即配置文件,解释语言等)是:

  • 修改或生成非原位,以便它们包含您指定的路径
  • 根据您的路径设置
  • ,足够聪明,可以搜索所需的文件
  • 足够聪明,可以搜索他们需要的文件,甚至在PATH之外(env变量通常在这里发挥作用)

它通常是三者的组合。

让我们看一下用于生成真实foo.ini的虚拟linked文件:

foo.ini.in

如果配置了--prefix = / home / sam会产生如下所示的foo.ini:

[global]
output_path=@prefix@/var/spool

注意,上面是以autoconf为中心的,但确实说明了这个概念。

要实现的另一个重要事项是,并非所有使用构建配置工具的程序都使用它允许您设置的首选项。我已经看到很多程序只服从它们添加的--prefix和--with-somelib / --without-somelib选项。

简而言之,并非所有行为都适用,但这是通常的工作方式的简要概述。

答案 3 :(得分:0)

autotools创建的其中一个文件是config.h,并且在此处存储了各种路径。您可以自定义config.h.in以添加供应用程序使用的其他路径。