在 Fedora 35 上:
# dnf install g++
Last metadata expiration check: 0:07:14 ago on Fri May 6 09:44:09 2022.
Package gcc-c++-11.3.1-2.fc35.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
# dnf info g++
Last metadata expiration check: 0:08:26 ago on Fri May 6 09:44:09 2022.
Error: No matching Packages to list
我知道gcc-c++
这是一个包,如果我想编译 C++,我应该安装它。
g++
如果不是软件包,为什么安装(甚至删除!)可以工作?
额外问题:如何检查是否gcc-c++
仅通过引用g++
而不是其真实名称来安装?
答案1
当您运行时dnf install <something>
,它会首先查找包名称<something>
,然后查找包含以下内容的包:提供 <something>
。 “provides”值实际上是一个虚拟包名称(使用Provides:
RPM 规范文件中的关键字设置)。
我们可以看到有哪些包提供 g++
通过运行:
dnf repoquery --whatprovides g++
(在 Fedora 35 上)会产生:
gcc-c++-0:11.2.1-1.fc35.i686
gcc-c++-0:11.2.1-1.fc35.x86_64
gcc-c++-0:11.3.1-2.fc35.x86_64
该dnf repoquery
命令查询您的存储库配置。您还可以使用 询问有关本地安装的软件包的相同问题rpm -q --whatprovides
,因此执行以下操作:
额外问题:如何通过仅引用 g++ 而不是其真实名称来检查 gcc-c++ 是否已安装?
赶紧跑:
rpm -q --whatprovides g++
返回码将告诉您是否有任何已安装的软件包提供g++
.
此功能通常用于指定链接到特定功能而不是特定包的包依赖项。例如,如果您有一些需要网络服务器的东西,而不是让它依赖于特定的包(例如,httpd
或nginx
),您可以在您的规范文件中写入:
Requires: webserver
然后,如果安装了这些软件包中的任何一个,则依赖性将得到满足:
$ dnf repoquery --whatprovides webserver
caddy-0:2.3.0-2.fc35.x86_64
httpd-0:2.4.51-2.fc35.x86_64
httpd-0:2.4.53-1.fc35.x86_64
lighttpd-0:1.4.59-3.fc35.x86_64
lighttpd-0:1.4.64-1.fc35.x86_64
nginx-1:1.20.1-6.fc35.x86_64
nginx-1:1.20.2-1.fc35.x86_64