在 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!
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
我知道gcc-c++这是一个包,如果我想编译 C++,我应该安装它。
g++如果不是软件包,为什么安装(甚至删除!)可以工作?
额外问题:如何检查是否gcc-c++仅通过引用g++而不是其真实名称来安装?
当您运行时dnf install <something>,它会首先查找包名称<something>,然后查找提供的 <something>包。“provides”值实际上是一个虚拟包名称(使用Provides:RPM 规范文件中的关键字设置)。
我们可以通过运行以下命令来查看包提供的 g++内容:
dnf repoquery --whatprovides g++
Run Code Online (Sandbox Code Playgroud)
(在 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
Run Code Online (Sandbox Code Playgroud)
该dnf repoquery命令查询您的存储库配置。您还可以使用 询问有关本地安装的软件包的相同问题rpm -q --whatprovides,因此执行以下操作:
额外问题:如何通过仅引用 g++ 而不是其真实名称来检查 gcc-c++ 是否已安装?
赶紧跑:
rpm -q --whatprovides g++
Run Code Online (Sandbox Code Playgroud)
返回码将告诉您是否有任何已安装的软件包提供g++.
此功能通常用于指定链接到特定功能而不是特定包的包依赖项。例如,如果您有一些需要网络服务器的东西,而不是让它依赖于特定的包(例如,httpd或nginx),您可以在您的规范文件中写入:
Requires: webserver
Run Code Online (Sandbox Code Playgroud)
然后,如果安装了这些软件包中的任何一个,则依赖性将得到满足:
$ 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
Run Code Online (Sandbox Code Playgroud)