查看“Building GCC”的源代码
←
Building GCC
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{Rating|1}} 在本教程中,我们将你的系统 [[GCC]] 升级到最新版本。(译者注:本文主要说明了从源代码构建GCC的过程,这个过程中通过现有GCC构建GCC,是一个Bootstrap自举过程。注意这里不是要构建交叉编译器,就是构建一个普通主机Host编译器) 这将帮助你构建[[GCC Cross-Compiler|GCC交叉编译器]],在构建交叉编译器时更建议你使用相同版本的编译器。 其实只要稍加小心,你也许就不必自举(bootstrap)新的现有系统编译器,但这是有风险的,而且可能会带来麻烦。 想要使用最新版本的交叉编译器,你应该为系统编译器和交叉编译器使用相同的主要编译器版本。 另见[http://gcc.gnu.org/install/ 关于建造GCC的官方指示]。 ==导言== 编译器通过称为自举(bootstrap)的过程进行升级。 首先,也许你的旧系统编译器生成的代码较慢慢,并不支持所有的新语言特性。 所以你可以使用这个旧的系统编译器来构建(build)新版本的编译器,希望旧的编译器能够构建新的编译器 (它支持所有需要的功能)。 这将生成一个新的编译器,新编译器可以生成较快速的代码并支持所有新功能,但也许本身速度较慢,因为它是用一个生成较慢代码的旧编译器编译的。 此外,新的编译器可能有错误,因为你的旧编译器的编译功能有错误,或者新的编译器版本中可能有错误。 下一步是使用产生更好代码的新编译器,然后再次构建新的编译器。 这将生成一个快速编译器,生成快速代码。 然而,我们构建的第一个编译器可能有错误,而我们刚刚使用它构建的编译器可能也有缺陷。 最后我们需要验证产生快速代码的新快速编译器的正确性。 为了解决这个问题,我们“第三次”构建编译器。(译者注:第一个编译器是原来的旧编译器,第二个编译器是用旧编译器从源代码构建的新编译器,第三个编译器是用新编译从同样源代码构建的另一个新编译器) 一旦我们使用第二个编译器构建了第三个编译器,第二个编译器的第一个编译器它们产生的输出应该完全相同,因为我们两次都使用了生成快速代码并使用相同源代码的编译器。 然后,编译器构建系统将验证第二个和第三个编译器是否相同,这使你对自举过程充满信心。 如果第二个和第三个编译器不相同,则自举失败,你遇到了编译器错误。 自举所需的时间是仅构建常规编译器的三倍,但它可以确保你的工具链是稳定的。 最后要做的是运行编译器测试套件,以便你可以验证它是否正常工作。 请注意,如果使用GCC4.4构建GCC4.8交叉编译器,以上同样的问题也可能会发生。 因此,建议使用GCC 4.8构建GCC 4.8交叉编译器,这样你能明确不会出现新旧这样的问题。 你不能自举交叉编译器,因为它不会为本地操作系统生成程序。 ===我需要自举过程吗?=== 如果你的系统编译器是与你希望构建的编译器版本相同的主要版本 (例如,如果你有4.6.2并想要4.6.3),那么你也许不需要自举。 小版本通常非常兼容。 你也许也能在没有自举的情况下构建另一个主要版本(如4.6.3构建4.7.3),但它可能不会生成理想的编译器。 随着编译器版本之间的差距扩大,你很可能会遇到麻烦。 每个主要的编译器版本应该总是能够使用自举构建下一个版本。 如果你有耐心,有可能找到一个非常老的LINUX系统和一个非常老的GCC版本,然后引导到最新的GCC版本,只需几次迭代升级主要的编译器版本。 你也可以通过其他渠道升级系统编译器。 ===我需要哪个编译器版本?=== 推荐使用最新的 [[GCC]],因为它是最新最好的版本。 目前,GCC 4.9.2是最新版本。 我们建议你使用交叉编译器的最新编译器版本。 你也可以使用较旧的版本,因为它们通常相当不错。 如果你的本地系统编译器不是太旧(至少GCC 4.6.0),你可能希望避免麻烦,只需为交叉编译器选择最新的次要版本(在你的系统编译器是4.6.1时,比如4.6.3)。 在这种情况下,你不需要自举,可以直接构建你的[[GCC Cross-Compiler|GCC交叉编译器]]。 你可以这样查看你当前的编译器版本: <source lang="bash">gcc --version</source> 如果你有耐心并希望自己构建最新、最棒的交叉编译器,那么在构建[[GCC Cross-Compiler|GCC交叉编译器]]之前,你需要自举系统编译器。 ===我还需要新的Binutils吗?=== 如果你的Binutils不是太过时,当然也不会有什么大碍,对于你的新系统编译器来说应该足够好。 你可以通过调用以下命令查看当前的Binutils版本: <source lang="bash">ld --version</source> 你可能至少需要Binutils 2.22,或者最好是最新的2.25版本。 == 准备构建 == <!-- Note how this section ([[Preparing GCC Build]]) is shared by [[Building GCC]] and [[GCC Cross-Compiler]]. --> {{:Preparing GCC Build}} == 构建 == 你需要决定在哪里安装新编译器。 替换你当前的系统编译器和安装到系统目录可能是一个非常糟糕的主意。 你还需要决定新的编译器是应该全局安装还是只为你安装。 如果你想只为你自己安装(推荐),安装到 <tt>$HOME/opt/gcc-x.y.z</tt>通常是一个好主意。 如果要全局安装它,通常将其安装到 <tt>/usr/local/gcc-x.y.z</tt> 中是一个好主意。 请注意,我们应该在源目录树外部构建所有内容,这被认为是良好的实践。 有些软件包只支持外部构建,有些只支持内部,有些两者都支持(但可能不会使用make提供广泛的检查)。 在源目录树内构建GCC会失败,至少对于较旧的版本是如此。 由于构建可能需要很长时间,因此建议使用 “-jN” 选项。 这将允许make使用多个线程来编译程序,这将大大加快速度。 将N替换为一个数字;一个好的指导原则是你的中央处理器的核心数量加1。 因此,对于4核CPU,你需要使用 : <source lang="bash"> make -j5 </source> ===准备=== <source lang="bash">export PREFIX="$HOME/opt/gcc-x.y.z"</source> === Binutils === <source lang="bash"> cd $HOME/src mkdir build-binutils cd build-binutils ../binutils-x.y.z/configure --prefix="$PREFIX" --disable-nls --disable-werror make make install </source> '''--disable-nls'''告诉Binutils不要包含本机语言支持。 这基本上是可选的,但可以减少依赖项和编译时间。 它还将导致只有英语诊断,当你提出问题时,可以让[http://forum.osdev.org/ 论坛]上的人都能理解。 === GCC === :‘’另请参阅[http://gcc.gnu.org/install/configure.html 配置GCC的官方说明]。‘’ <source lang="bash"> cd $HOME/src # 如果您希望构建这些包作为GCC的一部分: mv libiconv-x.y.z gcc-x.y.z/libiconv # Mac OS X users mv gmp-x.y.z gcc-x.y.z/gmp mv mpfr-x.y.z gcc-x.y.z/mpfr mv mpc-x.y.z gcc-x.y.z/mpc # 或在新的GCC版本中,你可以要求gcc下载先决条件 cd gcc-x.y.z ./contrib/download_prerequisites cd $HOME/src # Returning the main src folder mkdir build-gcc cd build-gcc ../gcc-x.y.z/configure --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ make make install </source> '''--disable-nls''' 与上面的Binutils相同。 '''--enable-languages'''告诉GCC不要编译它支持的所有其他语言前端,只编译C和C++。 即使你不打算使用C++制作操作系统,以后移植GCC时也将需要它。 '''--disable-bootstrap'''告诉编译器不要针对当前系统编译器自举自身。 这会导致更快的编译速度,但是如果当前编译器和新编译器在版本上差别太大,你将会得到不太健壮的编译器或奇怪的错误。 构建和自举GCC可能需要相当长的时间,所以坐下来放松,享受你即将使用GNU编译器套件的最新和最好的版本。 在运行<tt>make install</tt>并安装新编译器之前,如果你有额外的耐心,请阅读[http://gcc.gnu.org/install/test.html 官方测试说明]并测试编译器的缺陷。 ==使用新的编译器== 你现在可以通过调用以下类似的东西来运行你的新编译器: <source lang="bash">$HOME/opt/gcc-x.y.z/bin/gcc --version</source> 要简单地通过调用<tt>gcc</tt>来使用新编译器,请键入以下命令将<tt>$HOME/opt/gcc-x.y.z/bin</tt>添加到<tt>$PATH</tt>: <source lang="bash">export PATH="$HOME/opt/gcc-x.y.z/bin:$PATH"</source> 此命令会将你的新编译器添加到此shell会话的路径中。 如果希望永久使用,请将PATH命令添加到<tt>~/.profile</tt>配置shell脚本或类似文件。 有关详细信息,请参阅你的Shell文档。 == 构建交叉编译器 == {{Main|GCC Cross-Compiler}} 现在你有了一个最新的系统编译器,你可以为新的操作系统构建交叉编译器。 这样可以安全地使用GCC的最新和最好的版本作为交叉编译器,因为你使用了相同的版本来构建它。 一旦构建了实际的交叉编译器,就可以通过删除安装目录来卸载我们在本教程中构建的编译器。(译者注:真是过河拆桥啊,感觉留着自用不也挺好嘛) 交叉编译器将不依赖于构建它的编译器,就像我们的新编译器不依赖于它替换的旧系统编译器一样。 [[Category:Compilers]] [[Category:Tutorials]]
本页使用的模板:
Preparing GCC Build
(
查看源代码
)
模板:Eq
(
查看源代码
)
模板:Eq1
(
查看源代码
)
模板:If
(
查看源代码
)
模板:Main
(
查看源代码
)
模板:Rating
(
查看源代码
)
模板:Show1
(
查看源代码
)
模板:Wikitable
(
查看源代码
)
返回至“
Building GCC
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息