请原谅我的无知...我只使用 Solaris 来测试我感兴趣的 C/C++ 库。我不是 Solaris 管理员或 Solaris 用户。
我在 Solaris 11.3 x86 上安装了 GCC-5,因为我需要一个支持的 C++ 编译器-std=c++11
(请参阅下面的包输出)。 Sun 的原生 GCC 是 4.8,它不能很好地(或根本不)支持 C++11。
不幸的是,安装后我找不到它:
$ g++-5 --version
-bash: g++-5: command not found
$ sudo find /usr -name gcc-5
$ sudo find /bin -name gcc-5
$
为了完整性:
$ /bin/gcc --version
gcc (GCC) 4.8.2
...
$ ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 18 Jun 7 2016 /usr/bin/gcc -> ../gcc/4.8/bin/gcc
$ which gcc-5
no gcc-5 in /usr/local/bin /usr/local/sbin /bin /sbin /usr/bin /usr/sbin /usr/sfw/bin
编译器位于哪里?
根据在 Oracle Solaris 11 上安装 GCC/usr/bin/gcc
在 Stack Overflow 上,它应该作为符号链接存在。但答案似乎有点偏差:
$ /usr/bin/gcc --version
gcc (GCC) 4.8.2
...
根据Solaris 11 中缺少 GCC,并且服务器已部署关于服务器故障:
/usr/sfw/bin
是 Solaris 10 中捆绑的 gcc 路径。在 Solaris 11.1 上,安装后,gcc 可以/usr/bin
作为指向的符号链接直接使用/usr/gcc/<version>/bin/gcc
答案似乎也有些偏差。
$ sudo pkg install --accept gcc-5
------------------------------------------------------------
Package: pkg://solaris/release/[email protected],5.12-5.12.0.0.0.115.0:20170111T175931Z
License: evaluation
This software has been made available for evaluation purposes only.
See http://www.oracle.com/technetwork/server-storage/solaris11/technologies/foss-evaluation-program-2586275.html for further information.
Packages to install: 2
Create boot environment: No
Create backup boot environment: No
DOWNLOAD PKGS FILES XFER (MB) SPEED
Completed 2/2 8/8 0.0/0.0 17.4k/s
PHASE ITEMS
Installing new actions 37/37
Updating package state database Done
Updating package cache 0/0
Updating image state Done
Creating fast lookup database Done
Updating package cache 2/2
安装后gcc-5
:
$ find / -name 'gcc*' 2>/dev/null
/usr/share/vim/vim73/compiler/gcc.vim
/usr/share/gcc-4.8.2
/usr/share/man/man1/gcc.1
/usr/gcc
/usr/gcc/4.8/bin/gcc-nm
/usr/gcc/4.8/bin/gcc-ranlib
/usr/gcc/4.8/bin/gcc
/usr/gcc/4.8/bin/gcc-ar
/usr/gcc/4.8/lib/gcc
/usr/gcc/4.8/lib/gcc/i386-pc-solaris2.11/4.8.2/plugin/include/ada/gcc-interface
/usr/gcc/4.8/lib/gcc/i386-pc-solaris2.11/4.8.2/plugin/include/gcc-plugin.h
/usr/gcc/4.8/share/locale/de/LC_MESSAGES/gcc.mo
/usr/gcc/4.8/share/locale/ja/LC_MESSAGES/gcc.mo
/usr/gcc/4.8/share/locale/fr/LC_MESSAGES/gcc.mo
/usr/gcc/4.8/share/locale/zh_CN/LC_MESSAGES/gcc.mo
/usr/gcc/4.8/share/locale/zh_TW/LC_MESSAGES/gcc.mo
/usr/gcc/4.8/share/locale/es/LC_MESSAGES/gcc.mo
/usr/gcc/4.8/share/gcc-4.8.2
/usr/gcc/4.8/share/info/gccinstall.info
/usr/gcc/4.8/share/info/gccint.info
/usr/gcc/4.8/share/info/gcc.info
/usr/gcc/4.8/share/man/man1/gcc.1
/usr/bin/gcc
/usr/local/share/emacs/24.5/lisp/cedet/semantic/bovine/gcc.el
/usr/local/share/emacs/24.5/lisp/cedet/semantic/bovine/gcc.elc
/usr/include/gc/atomic_ops/sysdeps/gcc
/usr/include/avahi-common/gccmacro.h
/usr/include/pulse/gccmacro.h
/export/home/jwalton/botan/src/scripts/ci/circle/gcc-sanitizer.sh
/export/home/jwalton/botan/src/scripts/ci/circle/gcc-static-debug.sh
/export/home/jwalton/botan/src/scripts/ci/circle/gcc-shared-debug.sh
/export/home/jwalton/botan/src/build-data/cc/gcc.txt
/export/home/jwalton/zlib-1.2.8/contrib/gcc_gvmat64
/opt/developerstudio12.5/lib/compilers/CC-gcc/lib/gcc
/opt/developerstudio12.5/lib/compilers/CC-gcc/gcc_version.map
/opt/solarisstudio12.4/lib/compilers/CC-gcc/gcc_version.map
/opt/solarisstudio12.4/lib/compilers/CC-gcc/lib/gcc
和:
~$ pkg search -l gcc | grep ^basename
basename dir opt/developerstudio12.5/lib/compilers/CC-gcc/lib/gcc pkg:/developer/developerstudio-125/library/[email protected]
basename dir opt/solarisstudio12.4/lib/compilers/CC-gcc/lib/gcc pkg:/developer/solarisstudio-124/library/[email protected]
basename dir usr/include/gc/atomic_ops/sysdeps/gcc pkg:/library/[email protected]
basename link usr/bin/gcc pkg:/developer/gcc-4/[email protected]
basename file usr/gcc/4.8/bin/gcc pkg:/developer/gcc-4/[email protected]
pkg: Search performance is degraded.
答案1
长话短说:
# pkg change-facet \
version-lock.system/library/gcc/gcc-c-runtime=false \
version-lock.system/library/gcc/gcc-c++-runtime=false
然后再试一次。
所以问题是gcc-5
所谓的“组”包。也就是说,它(至少主要)由一堆group
依赖项组成。依赖项group
是指如果可能的话将安装的依赖项,否则将被忽略。在这种情况下,无法安装 的一个或多个依赖项gcc-5
,因此它们被忽略,最终得到的结果比您预期的要少。
当这种情况发生时(无论是更少的软件包,还是不同版本的软件包),您应该做的第一件事就是告诉pkg
您实际期望什么。 (现在,这里的脱节在于如何知道会发生什么;在不知道如何检查gcc-5
该信息的情况下,或者甚至知道您可能必须这样做,我不知道如何回答这个问题。)在这种情况下,选择以下之一查看它的依赖项是否有帮助;说,gcc-c-5
(您遵循了这一步骤gcc-c++-5
,这给您带来了与我在这里展示的相同的问题,但我想将它们放在一个答案中)。这告诉pkg
不要忽略它无法安装gcc-c-5
,而是实际详细地抱怨为什么它无法安装。希望输出中的内容能够为我们提供下一步该做什么的线索:
# pkg install -nv gcc-5 gcc-c-5
Creating Plan (Solver setup): |
pkg install: No matching version of developer/gcc-5 can be installed:
Reject: pkg://solaris/developer/[email protected]
Reason: No version matching 'group' dependency developer/gcc/gcc-c++-5 can be installed
----------------------------------------
Reject: pkg://solaris/developer/gcc/[email protected]
Reason: No version matching 'require' dependency developer/gcc/gcc-c-5 can be installed
----------------------------------------
Reject: pkg://solaris/developer/gcc/[email protected]
Reason: No version matching 'require' dependency system/library/gcc/[email protected],5.11-5.12.0.0.0.115.0 can be installed
----------------------------------------
Reject: pkg://solaris/system/library/gcc/[email protected]
Reason: No version matching 'require' dependency system/library/gcc/[email protected],5.11-5.12.0.0.0.115.0 can be installed
----------------------------------------
Reject: pkg://solaris/system/library/gcc/[email protected]
Reason: This version is excluded by installed incorporation consolidation/userland/[email protected]
----------------------------------------
Reason: This version is excluded by installed incorporation consolidation/userland/[email protected]
----------------------------------------
----------------------------------------
----------------------------------------
No matching version of developer/gcc/gcc-c-5 can be installed:
Reject: pkg://solaris/developer/gcc/[email protected]
Reason: [already rejected; see above]
当您得到像这样混乱的求解器输出时,您通常需要寻找最深的缩进问题并看看是否可以纠正它。在这种情况下,您会看到它无法安装,[email protected]
因为它被已安装的公司排除在外。
也许有必要题外话:什么是合并?与组包一样,它是一个主要提供依赖项(在本例中为incorporate
依赖项)的包。这些依赖项实际上不会导致安装包;他们只是对可能安装的软件包施加限制。具体来说,合并[email protected]
是指如果foo
安装了,则必须在该版本范围内[1.2, 1.3)
;也就是说,最小值1.2
(包括)和最大值1.3
(不包括),或任何与 相匹配的值1.2.x.y.z....
。
在这种情况下,系统上已安装的合并设置了与安装要求的版本不兼容的userland-incorporation
约束。gcc-c-runtime
gcc-c-runtime
gcc-c-5
这就是我们遇到 Solaris FOSS 评估程序的奇怪之处之一的地方。那里提供的软件包没有与系统的其他部分很好地集成;它们被设计为安装在较新版本的 Solaris 上。但它们的构建使得系统至少可以被合理地调整以允许安装它们。在这种情况下,你必须改变几个方面。
Solaris 中的大多数 FOSS 软件包都是以这样的方式合并的,即incorporate
可以放松由该依赖项提供的约束。您可以通过将命名为 的方面更改version-lock.<pkg-name>
为来做到这一点false
。在这种情况下,gcc-c-runtime
和gcc-c++-runtime
是阻止您想要的安装的两个包,因此(如上所述):
# pkg change-facet \
version-lock.system/library/gcc/gcc-c-runtime=false \
version-lock.system/library/gcc/gcc-c++-runtime=false
这会产生一些输出,但看起来作用不大。不过,一旦完成,我们可以再试一次:
# pkg install -nv gcc-5 gcc-c-5
Packages to install: 20
Packages to update: 2
Mediators to change: 1
Services to change: 1
Estimated space available: 8.54 GB
Estimated space to be consumed: 1.49 GB
Create boot environment: No
Create backup boot environment: Yes
Rebuild boot archive: No
Changed mediators:
mediator gcc:
version: None -> 5 (system default)
Changed packages:
solaris
developer/assembler
None -> 0.5.11,5.11-0.175.3.9.0.2.0:20160528T012706Z
developer/gcc-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T170530Z
developer/gcc/gcc-c++-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T164822Z
developer/gcc/gcc-c-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165027Z
developer/gcc/gcc-common-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165220Z
developer/gcc/gcc-gfortran-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165431Z
developer/gcc/gcc-gobjc-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T165624Z
developer/gnu-binutils
None -> 2.23.1,5.11-0.175.3.0.0.30.0:20150821T164528Z
library/gmp
None -> 4.3.2,5.11-0.175.3.0.0.30.0:20150821T165358Z
library/isl
None -> 0.12.2,5.12-5.12.0.0.0.115.0:20170111T171737Z
library/mpc
None -> 0.9,5.11-0.175.3.0.0.30.0:20150821T165558Z
library/mpfr
None -> 2.4.2,5.11-0.175.3.0.0.30.0:20150821T165559Z
release/evaluation
None -> 1.0,5.12-5.12.0.0.0.115.0:20170111T175931Z
system/header
None -> 0.5.11,5.11-0.175.3.19.0.2.0:20170328T014052Z
system/library/gcc/gcc-c++-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181800Z
system/library/gcc/gcc-c-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181840Z
system/library/gcc/gcc-gfortran-runtime
None -> 4.8.2,5.11-0.175.3.0.0.30.0:20150821T172507Z
system/library/gcc/gcc-gfortran-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181902Z
system/library/gcc/gcc-gobjc-runtime
None -> 4.8.2,5.11-0.175.3.0.0.30.0:20150821T172513Z
system/library/gcc/gcc-gobjc-runtime-5
None -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181919Z
system/library/gcc/gcc-c++-runtime
4.8.2,5.11-0.175.3.0.0.30.0:20150821T172447Z -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181825Z
system/library/gcc/gcc-c-runtime
4.8.2,5.11-0.175.3.0.0.30.0:20150821T172458Z -> 5.4.0,5.12-5.12.0.0.0.115.0:20170111T181848Z
瞧,我们安装了一堆软件包,其中实际上包含了一些东西。从这里,您现在应该能够输入gcc --version
并看到它确实是 5.4.0。另请注意,我们解锁的两个方面的软件包已升级,解锁后可能可用。
您可能会问为什么我们不需要解锁任何其他方面。原因是 Solaris 11.3 没有提供 GCC 5,因此没有对其软件包版本提供任何限制。所以所有的gcc-*-5
包都已经不受约束了,不需要解锁来放松约束。
您可能会注意到gcc-gfortran-runtime
和gcc-gobjc-runtime
软件包已安装在 4.8 版本中。那是因为它们仍然受到限制,但我们所做的一切都没有与这些限制相冲突。为了保持一致性,您可能也应该解锁它们,然后将它们升级到 5.x 版本(或者,如果您在尝试任何操作之前已经完成了这一步,只需从一开始就解锁它们)。
答案2
尝试这个:
ls -l /usr/bin/gcc
你可能会看到类似的东西
... /usr/bin/gcc -> ../gcc/4.8/bin/gcc
GCC 5.x 应该在/usr/gcc/5.x/...
我的 Solaris 11 安装有多个版本的 GCC,位于/usr/gcc
.
更新:并且下面的这些版本都不/usr/gcc
是 5.x 版本。它去哪儿了?
答案3
首先,来自的列表pkg publisher
会很有用。以及ASApkg list |grep gcc
而且它似乎没有安装,您的输出仅显示正在安装 (2) 个 pkgs 和 (8) 个文件。
您可能需要释放限制才能安装。安装的输出提示您正在从 FOSS 评估链进行安装。建议您查看输出中提供的链接:
如何访问 Oracle Solaris 11.3 的选定 FOSS 评估包
另外:通常 apkg search gcc
应该帮助找到某些东西的安装位置以及 pkg? Apkg contents <pkg>
对于查找 pkg 的组成部分也很有用。
我还预计会看到安装多个 pkg,而不是仅安装 2 个,因为我相信 gcc pkg 应该尝试为所有开发人员工具安装多个 pkg。
也许这是您在发布存储库下想要的 pkg? developer/gcc/gcc-c++-5