在 Solaris 11 上安装 GCC-5 后,它在哪里?

9 solaris gcc package-management ips

请原谅我的无知...我只使用 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
$
Run Code Online (Sandbox Code Playgroud)

为了完整性:

$ /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
Run Code Online (Sandbox Code Playgroud)

编译器在哪里?


根据在 Stack Overflow上的 Oracle Solaris 11安装 GCC,它应该/usr/bin/gcc作为符号链接。但答案似乎有点偏离:

$ /usr/bin/gcc --version
gcc (GCC) 4.8.2
...
Run Code Online (Sandbox Code Playgroud)

根据Solaris 11 中缺少的 GCC,并且服务器已经部署在 Server Fault 上:

/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/evaluation@1.0,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
Run Code Online (Sandbox Code Playgroud)

安装后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
Run Code Online (Sandbox Code Playgroud)

和:

~$ pkg search -l gcc | grep ^basename
basename             dir    opt/developerstudio12.5/lib/compilers/CC-gcc/lib/gcc               pkg:/developer/developerstudio-125/library/studio-gccrt@12.5-1.0.0.0
basename             dir    opt/solarisstudio12.4/lib/compilers/CC-gcc/lib/gcc                 pkg:/developer/solarisstudio-124/library/studio-gccrt@12.4-1.0.0.0
basename             dir    usr/include/gc/atomic_ops/sysdeps/gcc                              pkg:/library/gc@7.2-0.175.2.0.0.39.0
basename                    link   usr/bin/gcc                                                        pkg:/developer/gcc-4/gcc-c-48@4.8.2-0.175.3.0.0.30.0
basename                    file   usr/gcc/4.8/bin/gcc                                                pkg:/developer/gcc-4/gcc-c-48@4.8.2-0.175.3.0.0.30.0
pkg: Search performance is degraded.
Run Code Online (Sandbox Code Playgroud)

小智 10

特尔;博士:

# pkg change-facet \
      version-lock.system/library/gcc/gcc-c-runtime=false \
      version-lock.system/library/gcc/gcc-c++-runtime=false
Run Code Online (Sandbox Code Playgroud)

然后再试一次。

所以问题是这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/gcc-5@5.4.0-5.12.0.0.0.115.0
  Reason:  No version matching 'group' dependency developer/gcc/gcc-c++-5 can be installed
    ----------------------------------------
    Reject:  pkg://solaris/developer/gcc/gcc-c++-5@5.4.0-5.12.0.0.0.115.0
    Reason:  No version matching 'require' dependency developer/gcc/gcc-c-5 can be installed
      ----------------------------------------
      Reject:  pkg://solaris/developer/gcc/gcc-c-5@5.4.0-5.12.0.0.0.115.0
      Reason:  No version matching 'require' dependency system/library/gcc/gcc-c++-runtime@5.4.0,5.11-5.12.0.0.0.115.0 can be installed
        ----------------------------------------
        Reject:  pkg://solaris/system/library/gcc/gcc-c++-runtime@5.4.0-5.12.0.0.0.115.0
        Reason:  No version matching 'require' dependency system/library/gcc/gcc-c-runtime@5.4.0,5.11-5.12.0.0.0.115.0 can be installed
          ----------------------------------------
          Reject:  pkg://solaris/system/library/gcc/gcc-c-runtime@5.4.0-5.12.0.0.0.115.0
          Reason:  This version is excluded by installed incorporation consolidation/userland/userland-incorporation@0.5.11-0.175.3.19.0.2.0
          ----------------------------------------
        Reason:  This version is excluded by installed incorporation consolidation/userland/userland-incorporation@0.5.11-0.175.3.19.0.2.0
        ----------------------------------------
      ----------------------------------------
    ----------------------------------------
No matching version of developer/gcc/gcc-c-5 can be installed:
  Reject:  pkg://solaris/developer/gcc/gcc-c-5@5.4.0-5.12.0.0.0.115.0
  Reason:  [already rejected; see above]
Run Code Online (Sandbox Code Playgroud)

当您得到像这样一团糟的求解器输出时,您通常想要寻找最深的问题,看看是否可以纠正它。在这种情况下,您会看到它无法安装,gcc-c-runtime@5.4.0-5.12.0.0.0.115.0因为它被已安装的公司排除在外。

也许有必要离题一下:什么是公司?与组包一样,它是一个主要提供依赖项的包,在本例中为incorporate依赖项。这些依赖项实际上从未导致安装软件包;它们只是对可能安装的软件包施加限制。具体来说,加入foo@1.2意味着如果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
Run Code Online (Sandbox Code Playgroud)

这将提供一些输出,但似乎不会做太多。但是,一旦完成,我们可以再试一次:

# 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
Run Code Online (Sandbox Code Playgroud)

瞧,我们安装了一堆包,它们实际上包含了一些东西。从这里开始,您现在应该能够输入gcc --version并看到它确实是 5.4.0。另请注意,我们解锁的两个软件包的方面已升级,解锁后可用。

您可能会问为什么我们不需要解锁任何其他方面。原因是 Solaris 11.3 没有提供 GCC 5,因此没有提供对其软件包版本的任何限制。所以所有的gcc-*-5包都已经不受约束,不需要为了放松约束而解锁。

您可能会注意到gcc-gfortran-runtimegcc-gobjc-runtime软件包是在 4.8 版本中安装的。那是因为它们仍然受到约束,但我们所做的没有与这些约束相冲突。为了保持一致性,您可能也应该解锁它们,然后将它们升级到它们的 5.x 版本(或者,如果您在尝试任何事情之前已经做到了这一点,请从一开始就解锁它们)。


And*_*nle 1

尝试这个:

ls -l /usr/bin/gcc
Run Code Online (Sandbox Code Playgroud)

你可能会看到类似的东西

... /usr/bin/gcc -> ../gcc/4.8/bin/gcc
Run Code Online (Sandbox Code Playgroud)

GCC 5.x 应该在/usr/gcc/5.x/...

我的 Solaris 11 安装有多个版本的 GCC,位于/usr/gcc.

更新:下面的这些版本都不/usr/gcc是 5.x 版本。它去哪儿了?