惯用的 Unix 程序如何检测它们安装的前缀是什么?

惯用的 Unix 程序如何检测它们安装的前缀是什么?

如果我安装一个带有非标准前缀的二进制文件,例如/opt/bin/foo,它需要来自 的一些静态文件/opt/share/foo,它如何找到它们?使用相对于可执行文件 ( ../share/foo) 的反向引用?编译时硬编码?

什么是惯用语应用程序处理变量安装前缀的方法?所有目录都应该加前缀吗? (关于什么/var?)

答案1

在编译时对此类引用进行硬编码是很常见的,并且可能提供命令行选项或环境变量来覆盖编译时默认值。通常,程序只记住一个配置文件的位置(通常在 下/etc),其中任何编译时默认值都可以被覆盖。这种方法对于由制作操作系统的同一个人编译的开源软件最有意义,作为 Linux 发行版或 BSD 移植的一部分。

对于以二进制形式分发的应用程序,通常的方法是从其第零个参数定位应用程序二进制文件。按照惯例,第 0 个参数execve(ie argv[0]) 是二进制文件的路径(由调用者(通常是 shell)遵守约定)。如果argv[0]不包含任何/,应用程序应对$PATH其执行查找。

答案2

我想说最常见的是检测--prefix.不同的路径可以由不同的前缀提供,并且在autotools中有单独的系统配置(“ /etc”)、库目录(“ /usr/lib”)等

答案3

用于编译程序的工具(例如 GNU Autotools)可以获取给定选项的值--prefix并将其作为定义放入头文件中。

#define PREFIX "/usr/local/"

在您的代码中,您只需将PREFIX其用作路径名的一部分。

答案4

在 Unded Unix 中,没有可移植的方法来检测二进制文件从哪个位置启动,即编译变量安装前缀。

相关内容