![查找不在路径中的二进制文件/文件/库——特别是 gcj](https://linux22.com/image/503362/%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%B7%AF%E5%BE%84%E4%B8%AD%E7%9A%84%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%2F%E6%96%87%E4%BB%B6%2F%E5%BA%93%E2%80%94%E2%80%94%E7%89%B9%E5%88%AB%E6%98%AF%20gcj.png)
我正在尝试构建 pdftk,它显然需要 gcj。由于它尚未在我的路径中,因此我可以将包含 gcj 的目录添加到我的路径中,或者在预制的 Makefile 中定义路径。
问题是我不知道:
a) gcj 在哪里,以及 b) 它是否存在于服务器上(至少以我可以添加到路径的方式)。
在我之前尝试从源代码构建二进制文件时,这个问题出现过多次,所以我希望我可以同时问两个问题来解决我当前的问题并避免将来出现这个问题......
有没有办法将我有读取/执行权限的所有内容添加到我的路径中?子问题,这是个坏主意吗?
是否
whereis
只搜索我的路径?是否有等效方法可以查找我需要的文件/目录,而不必搜索整个主机并导致其他每个目录的访问被拒绝?有什么方法可以让我确切地知道某个库/二进制文件是否确实不可用,而不是只是不在我的路径上?
有没有办法可以具体判断
gcc
是否gcj
可用?我可以将 gcj 编译到我的用户目录中而不用编译所有的 gcc 吗?
在构建二进制文件时,是否有一种(通用的)方法来标记编译或生成文件以处理发现的任何依赖项,而不是简单地失败?
共享主机情况下的典型用户是否有能力使用操作系统包库来获取用户级别的包?
答案1
(1.) 有没有办法将我有读取/执行权限的所有内容添加到我的路径中?子问题,这是个坏主意吗?
...从安全原因来看,这是个坏主意。
(2.) whereis 是否只搜索我的路径?是否有一些等效方法可以查找我需要的文件/目录,而不必搜索整个主机并拒绝访问其他每个目录?
您可以使用locate(或glocate可在 OpenCSW 的 findutils 中使用)使用 -r 选项,允许使用正则表达式:glocate -r /gcj$
(3.) 有没有办法可以让我确切地知道某个库/二进制文件是否确实不可用,而不是只是不在我的路径上?
glocate 可以告诉您这一点,假设它gupdatedb
最近已经运行过。
(4.) 有没有办法可以判断 gcc 中 gcj 是否可用?
最好的方法是扫描已安装的软件包。已安装文件的列表位于 中/var/sadm/install/contents
。
(5.)我可以将 gcj 编译到我的用户目录中,而不必用它编译整个 gcc 吗?
还没有尝试过,但你仍然需要经历很多麻烦。最好抓住已经可用的 gcj 二进制文件。如果你必须自己编译,那么最好使用现有的构建描述,例如这个。
(6.)在构建二进制文件时,是否存在一种(通用)方法来标记编译或生成文件以处理发现的任何依赖项,而不是简单地失败?
我猜你正在考虑 Gentoo 的 emerge 之类的东西,它会在编译你想要的包之前下载并安装依赖包。这不容易做到;特别是如果你以普通用户的身份编译所有内容,因为你需要使用 chroot 环境。这是一个好主意,但做起来并不容易。
(7.) 共享主机情况下的典型用户是否能够使用操作系统包库在用户级别获取包?
你是什么意思获取包? 如果您想要提取 .pkg 文件的内容,则可以使用 pkgtrans 命令,如下所示:pkgtrans foo.pkg ./ all
但是,也可以执行类似以下操作构建器它会创建一个 chroot 环境,您可以在其中的主目录中进行编译以及包安装。
回到 gcj 问题,我认为您需要指定 makefile 的构建时间依赖项,并依赖于已知路径中包含 gcj 的包,然后您可以在构建描述中使用该路径。
一般来说,如果您在共享主机中,编译软件包将会很麻烦,最好找到一个可以安装和删除软件包并写入 /usr 的系统。
使用某种构建框架也是一个好主意,例如加纳阿尔及利亚,它可以完成所有正确的事情并消除许多烦恼:它会检查构建时依赖项、下载 tarball、验证校验和、提取、应用补丁(如果有)、配置、构建、安装和制作软件包,并且您可以在单个 Makefile 中指定所有内容。学习使用这样的框架需要一些时间,但如果您倾向于自己构建软件包,那么花在学习上的时间很快就会得到回报。
答案2
是的,出于安全原因,这不是一个好主意。恶意脚本或程序,或者简单的错误都可能造成真正的问题。
whereis
搜索明显的地方,如/bin
、/usr/bin
等。请参阅手册页的 FILES 部分
locate
如果可用,则可以使用,find
否则:
locate gcj
或者
find / -name gcj
答案3
1:没人会这么做->坏主意。
2 + 3:肯定的方法是:
pkginfo | grep -i gcj # (Solaris specific)
find / -name gcj 2>/dev/null
4:不知道。
5:可能,而且显然这需要大量的手工工作。
6:不。在 Makefile 中,您只需将通常包含 gcj 的任何目录(您的猜测)附加到 PATH。这不会伤害任何人。
7:不,安装软件包由管理员负责。但您无需成为管理员即可将软件包中包含的文件提取到您的主目录中:
pkgtrans my-gcj.pkg . # (Solaris specific) converts package to a "filesystem format package" (i.e. directory tree)
经过这样的减法(所有权错误、路径错误、库路径错误、配置文件路径错误、未执行安装脚本、未检查先决条件等),软件将很少可用。此类操作不仅在 Solaris 上可行,在大多数其他 Unix/Linux 版本上也可行 - 使用其打包工具。