![惯用的 Unix 程序如何检测它们安装的前缀是什么?](https://linux22.com/image/841/%E6%83%AF%E7%94%A8%E7%9A%84%20Unix%20%E7%A8%8B%E5%BA%8F%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%E5%AE%83%E4%BB%AC%E5%AE%89%E8%A3%85%E7%9A%84%E5%89%8D%E7%BC%80%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
如果我安装一个带有非标准前缀的二进制文件,例如/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 中,没有可移植的方法来检测二进制文件从哪个位置启动,即编译变量安装前缀。