在非根文件夹中构建 GCC

在非根文件夹中构建 GCC

好吧,这是我在这里的第一个问题——可能也是众多问题中的第一个。

我是一名 Linux 新手,正在尝试学习从源代码进行构建的方法。

我的环境:通过 Putty 通过 SSH 连接到 Windows 10 虚拟机上的 Ubuntu Server 14.04.5

我希望 GCC 成为我从源代码构建的第一个程序。

以下是我目前的流程:

为了获得 GCC,以便我可以构建不同的 GCC(我知道这很有趣),/home/anton我从默认目录运行:

sudo apt-get install build-essential
sudo apt-get install m4
sudo apt-get install texinfo

我的目标是在根目录之外创建另一个目录,这是我的新 GCC 构建的源目录——我们称之为/AntonProj1

我遇到的问题是接下来的步骤...这是我的想法;请让我知道这是否是正确的逻辑,或者我是否错误地解释了构建/依赖过程。

  • 步骤 1)从以下位置下载 GCC(gcc-4.1-20080630.tar.bz2 http://www.netgull.com/gcc/snapshots/4.1-20080630/)到/AntonProj1[我将使用 FileZilla 手动将 .bz2 文件移动到/AntonProj1
  • 步骤 2)contrib/download_prerequisites运行/AntonProj1
  • 步骤 3)export PREFIX="AntonProj1/opt/gcc-4.1"??? <-这看起来对吗?

第 3 步是关于我的困惑开始的地方...或者至少是我感觉受困的地方。

我读了一些东西这里说的是:

“请注意,我们在源目录树之外构建所有内容,这被认为是一种良好做法。有些软件包仅支持在外部构建,有些仅支持在内部构建,有些则两者都支持(但可能不提供使用 make 的广泛检查)。在源目录树内构建 GCC 会失败,至少对于旧版本而言。”

这是否只是说在其中构建 GCC 是可以的/AntonProj1(因为我用来构建这个 GCC 的 GCC 位于不同的源目录中);但是,例如,如果我想使用位于中的新 GCC 构建/AntonProj1来构建其他程序……比如说,像 Lynx 这样的东西,我需要确保 Lynx 的源目录不是/AntonProj1...也许是类似的东西/AntonProj1/Lynx

TL;DR:当我的限制是以下情况时,如何准备从源代码编译 GCC 的最佳方法是什么:

  • 1)下载并编译GCC到/AntonProj1
  • 2)使用下载并编译的 GCC/AntonProj1从源代码构建/AntonProj1文件夹中的其他程序

答案1

首先,既然你已经运行了,sudo apt-get install build-essential那你肯定已经gcc安装了。你可以运行 来找出你拥有的版本 gcc -v。这个已安装版本的位置是/usr/lib/gcc/version-number/

/usr/bin/gccgcc是Ubuntu 中二进制文件的默认位置。

接下来,您要安装以前的版本。

  1. 为了gcc-4.1

由于此版本在较旧的 Ubuntu 版本中可用,因此我们需要有适合该版本的存储库。通过一些搜索,我发现它们是以下内容,必须将它们添加到/etc/apt/sources.list

deb     http://snapshot.debian.org/archive/debian/20070730T000000Z/ lenny main
deb-src http://snapshot.debian.org/archive/debian/20070730T000000Z/ lenny main
deb     http://snapshot.debian.org/archive/debian-security/20070730T000000Z/ lenny/updates main
deb-src http://snapshot.debian.org/archive/debian-security/20070730T000000Z/ lenny/updates main

*这些链接取自这个答案

完成后sudo apt-get update新的存储库将可用。

接下来,安装所需的编译器。为了实现互操作性,我通常会安装相同版本gccg++。对于一般用途,建议这样做。

因此,

sudo apt-get install gcc-4.1 g++-4.1

2. 检查可用的编译器

在这个阶段,我们将有两组编译器(分别用于g++gcc)。这些可以通过检查dpkg --list | grep compiler

dpkg --list | grep compiler
ii  antlr3.2                              3.2-14                                              all          language tool for constructing recognizers, compilers etc
ii  g++                                   4:5.3.1-1ubuntu1                                    amd64        GNU C++ compiler
ii  g++-4.1                               4.1.2-13                                            amd64        The GNU C++ compiler
ii  g++-4.1-multilib                      4.1.2-13                                            amd64        The GNU C++ compiler (multilib files)
ii  g++-5                                 5.4.0-6ubuntu1~16.04.4                              amd64        GNU C++ compiler
ii  gcc                                   4:5.3.1-1ubuntu1                                    amd64        GNU C compiler
ii  gcc-4.1                               4.1.2-13                                            amd64        The GNU C compiler
ii  gcc-4.1-multilib                      4.1.2-13                                            amd64        The GNU C compiler (multilib files)
ii  gcc-5                                 5.4.0-6ubuntu1~16.04.4                              amd64        GNU C compiler
ii  gcc-5-multilib                        5.4.0-6ubuntu1~16.04.4                              amd64        GNU C compiler (multilib support)
ii  gcc-multilib                          4:5.3.1-1ubuntu1                                    amd64        GNU C compiler (multilib files)
ii  hardening-includes                    2.7ubuntu2                                          all          Makefile for enabling compiler flags for security hardening
ii  libantlr-java                         2.7.7+dfsg-6ubuntu1                                 all          language tool for constructing recognizers, compilers etc (java library)
ii  libllvm3.8:amd64                      1:3.8-2ubuntu3                                      amd64        Modular compiler and toolchain technologies, runtime library
ii  libllvm3.8:i386                       1:3.8-2ubuntu3                                      i386         Modular compiler and toolchain technologies, runtime library
ii  libxkbcommon0:amd64                   0.5.0-1ubuntu2                                      amd64        library interface to the XKB compiler - shared librar

重要的是两组编译器的位置,可以通过以下方式列出:

ls -lh /usr/bin/gcc*
lrwxrwxrwx 1 root root    5  五   5  2016 /usr/bin/gcc -> gcc-5
-rwxr-xr-x 1 root root 208K  七  10  2007 /usr/bin/gcc-4.1
-rwxr-xr-x 1 root root 895K 十一  3 10:00 /usr/bin/gcc-5

ls -lh /usr/bin/g++*
-rwxr-xr-x 1 root root 210K  七  10  2007 /usr/bin/g++-4.1
-rwxr-xr-x 1 root root 899K 十一  3 09:41 /usr/bin/g++-5
  1. 为当前目的(构建应用程序)选择编译器

安装所需的编译器后,可以简单地在编译器之间切换。这可以通过更新应用程序的备选版本列表来实现。为此,update-alternative必须使用某些参数运行该命令。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60 --slave /usr/bin/g++ g++ /usr/bin/g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.1
sudo update-alternatives --config gcc

这将链接g++gcc,并且仅在更改时gcc才会g++自动更改。

然后,无论何时您想要更改编译器,请输入以下命令:

sudo update-alternatives --config gcc

然后,询问用户选择哪个编译器。

  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-5     60        auto mode
  1            /usr/bin/gcc-4.1   40        manual mode
Press <enter> to keep the current choice[*], or type selection number:

在这里您可以按键(0,1)然后按回车键进行选择。可以通过 检查当前选定版本中的更改gcc -v

4. 使用已安装的编译器构建应用程序

一些基本准则:

  • 一般有两个步骤,构建(build)和制作(make)。该build步骤涉及生成系统特定代码以供安装,这需要链接到所需的编译器。make相当于安装在某个目录中。任何应用程序都可以build安装make在用户决定的任何文件夹中。
  • 选择build 一个临时文件夹。成功执行步骤后,可以删除此文件夹make。重要的是,对于该make步骤,安装目标通常是在脚本运行--prefix=/path/to/folder时定义的build。例如,如果安装脚本是.setup,那么在大多数情况下, ./setup --prefix=/path/to/installation/folder

有关具体详细信息,请参阅应用程序的手册或指南。

运行构建脚本时,将使用当前选定的编译器版本(gccg++)。运行已安装的应用程序时,行为将取决于程序是从环境变量中获取编译器还是链接到特定二进制文件。必须在安装后检查。


  • cmakemake是用于安装的单独实用程序。不同的应用程序需要不同的版本,因此请相应地安装所需的实用程序和版本。

  • 对于编译器来说和的步骤build也是make相同的。

答案2

以下是我最终实际有效的过程:

创建目录来存储下载内容和解压后的目录:

sudo mkdir -p /AntonProj1/opt/downloads /AntonProj1/tmp
  • 步骤 1)从以下位置下载 GCC(gcc-4.1-20080630.tar.bz2http://www.netgull.com/gcc/snapshots/4.1-20080630/)到/AntonProj1/opt/downloads[我使用 FileZilla 手动将 .bz2 文件移动到/AntonProj1

  • 步骤 2)将文件移动到/AntonProj1/opt/downloads

  • 步骤3)运行以下命令:

    sudo apt-get install build-essential sudo apt-get m4 sudo apt-get texinfo

    sudo apt-get install libgmp3-dev sudo apt-get install libmpfr-dev libmpfr-doc libmpfr4 libmpfr4-dbg

    sudo apt-get update sudo apt-get upgrade sudo apt-get autoremove

现在来看看最重要的/最耗时的部分: (这实际上是确保我们在所需的目录中进行构建/AntonProj1

sudo ./configure -prefix=/AntonProj1 --without-[blah blah]*

*--without-[blah blah]当您执行实际上从源代码构建的命令时,有一种方法可以帮助解决依赖性问题:

sudo make

*也就是说,.configure 很可能会向您显示缺少哪些依赖项……甚至可能在创建 makefile 之前停止。但是,即使创建了 makefile,当您实际运行时,sudo make您可能会(读作:将)发现构建失败。因此,如果您不断遇到构建失败,即使您安装了所请求的依赖项,也可能需要告诉编译器不要担心某些事情,这可以通过 来完成;可以通过运行访问帮助文件来找到--without-[blah blah]有关标志的更多信息。./configure.configure -h

注意:如果您最终改变了./configure标志,您需要运行:

sudo make clean

然后./configure再次使用新的标志。

相关内容