在 OS X 10.11 上构建 GCC

2023-12-03

在 OS X 10.11.1 上使用命令行构建 GCC(最新版本):

../gccx/configure --with-gmp="/opt/local" --with-mpfr="/opt/local" \
    --with-mpc="/opt/local" --with-libiconv-prefix="/opt/local" --with-pkgversion="GCCX" \
    --program-transform-name='s/^gcc$/gccx/; s/^g++$/g++x/' --enable-languages=c

严格遵循构建说明,并收到此错误:

g++ -std=gnu++98   -g  -DIN_GCC    -fno-strict-aliasing
-fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-format -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common  -DHAVE_CONFIG_H -DGENERATOR_FILE -fno-PIE -Wl,-no_pie   -o build/genmatch \
        build/genmatch.o ../build-x86_64-apple-darwin15.0.0/libcpp/libcpp.a build/errors.o build/vec.o build/hash-table.o ../build-x86_64-apple-darwin15.0.0/libiberty/libiberty.a Undefined symbols for architecture x86_64:  "_iconv", referenced from:
     convert_using_iconv(void*, unsigned char const*, unsigned long, _cpp_strbuf*) in libcpp.a(charset.o)
    (maybe you meant: __Z14cpp_init_iconvP10cpp_reader, __cpp_destroy_iconv )  "_iconv_close", referenced from:
     __cpp_destroy_iconv in libcpp.a(charset.o)
     __cpp_convert_input in libcpp.a(charset.o)  "_iconv_open", referenced from:
     init_iconv_desc(cpp_reader*, char const*, char const*) in libcpp.a(charset.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[3]: *** [build/genmatch] Error 1 make[2]: *** [all-stage1-gcc] Error 2 make[1]: *** [stage1-bubble] Error 2 make:
*** [all] Error 2

(完整的日志可在https://gist.github.com/3cb5d044533e657f4add.)

调查后gcc/Makefile,似乎BUILD_CPPLIB变量不包括 $(LIBICONV),因为它在发生错误时处于 stage1 引导程序中。相关部分之前是

# For stage1 and when cross-compiling use the build libcpp which is
# built with NLS disabled.  For stage2+ use the host library and
# its dependencies.

但很明显,stage1 构建build/genmatch正在引用 libcpp,它使用 libiconv 中的符号。所以这里有些不对劲。

我该如何修复它?


一般讨论;一般交流

在 Mac OS X 上构建 GCC 的过程有时会充满麻烦。多年来,我在使用不同版本的 GCC 和不同版本的 Mac OS X 时遇到过各种问题。你可以看到我之前所做的解释在 Mac OS X 上安装 GCC— 用于在 Mavericks 10.9.x(或可能是 Mountain Lion 10.8.x)上构建 GCC 4.8.x;它还报告在 Mavericks 10.9.x 上成功构建 GCC 4.9.0,但在 Yosemite 10.10.x 上失败。

这是在 Mac OS X 10.11.1 El Capitan 上构建 GCC 5.2.0 的更新配方。 它开始使用 XCode 7.1.1 — 我不知道哪些其他版本的 XCode 还可以。

注意埃尔卡皮坦具有 Yosemite 及早期版本中没有的功能 SIP(​​系统完整性保护)。这意味着您不能在下创建任意目录/usr不再有。我曾经安装在/usr/gcc/vX.Y.Z; El Capitan 不再允许这样做。因此,一项重大变化是我现在安装在/opt/gcc/v.X.Y.Z.

我发现设置 DYLD_LIBRARY_PATH 是有问题的——尤其是在 El Capitan 上。与过去的重大突破是,我现在根本不设置它。请注意,脚本已取消设置它。另请注意,该脚本显式将第 1 阶段编译器 CC 和 CXX 设置为/usr/bin/clang and /usr/bin/clang++分别(XCode 编译器)。当前版本的 GCC 需要功能强大的 C++ 编译器,而不是(或同时)C 编译器。

我偶尔会遇到问题libiconv,但目前我通过没有安装我自己的版本来逃避它们。同样,我偶尔也会遇到 GCC 源代码中的某些 awk 脚本的问题。我必须破解它/它们才能让它正常工作。然而,通过 GCC 5.2.0 源代码的发布副本,我似乎能够直接开箱即用地进行构建。

如果您只有一个磁盘分区,那么下一点并不重要。如果您有多个磁盘,请确保目标目录不存在或确保其名称正是您想要的。在工作机器上(不是 Mac,而是 Linux 机器等),我仍然使用/usr/gcc/vX.Y.Z作为“官方”安装位置,但该软件最终会出现在某个有足够空间的任意文件系统中,例如/work4/gcc,最终有一个符号链接/usr/gcc/vX.Y.Z到达/work4/gcc/vX.Y.Z。然而,至关重要的是/work4/gcc/vX.Y.Z在编译 GCC 时不存在,因为它将通过以下方式解析名称realpath()或其等价物并嵌入/work4/gcc/vX.Y.Z进入二进制文件,而不是中性名称/usr/gcc/vX.Y.Z。这限制了安装的便携性;它移动到的任何其他机器都必须有一个目录/work4/gcc/vX.Y.Z,即使您要求将其安装在/usr/gcc/vX.Y.Z.

使用 XCode 7.1.1 在 Mac OS X 10.11.1 上编译 GCC 5.2.0

我必须使用 GMP(5.1.3 而不是 6.0.0a)和 ISL(0.14 而不是 0.15)的降级版本。后续版本的构建都给我带来了麻烦。

请注意,我放置了 GMP、MPC、MPFR、ISL 和 Cloog 的库代码(请参阅海湾合作委员会先决条件)在 GCC 源目录中,以便 GCC 构建这些库自己的版本。我发现这是确保 GCC 正确找到这些库的最简单方法。

目标目录:/opt/gcc/v5.2.0

在运行 Intel Core i7、2.3 GHz、16 GiB 1333 MHz DDR3 主内存和 750 GB 5400 rpm 硬盘驱动器的 17" MacBook Pro(2011 年初)上,构建时间约为 2 小时 15 分钟。源代码占用约 850 MiB;构建树最终约为 4.6 GiB — 您需要足够的磁盘空间。安装的代码最终约为 420 MiB。

使用的脚本——extract-gcc-5.2.0.sh

#!/bin/bash

unset DYLD_LIBRARY_PATH

TAR=tar
VER_NUM=5.2.0
GCC_VER=gcc-${VER_NUM}
TGT_BASE=/opt/gcc
TGT_DIR=${TGT_BASE}/v${VER_NUM}
CC=/usr/bin/clang
CXX=/usr/bin/clang++

extract() {
    echo "Extract $1"
    $TAR -xf $1
}

if [ ! -d "$GCC_VER" ]
then extract ${GCC_VER}.tar.bz2 || exit 1
fi

(
cd ${GCC_VER} || exit

nbncl <<EOF |
    cloog 0.18.1 tar.gz 
    gmp 5.1.3 tar.xz 
#   gmp 6.0.0 tar.lz 
    isl 0.14 tar.bz2 
#    isl 0.15 tar.bz2 
    mpc 1.0.3 tar.gz 
    mpfr 3.1.3 tar.xz
EOF

while read file vrsn extn
do
    tarfile="../$file-$vrsn.$extn"
    if [ ! -f "$tarfile" ]
    then echo "Cannot find $tarfile" >&2; exit 1;
    fi
    if [ ! -d "$file-$vrsn" ]
    then
        (
        set -x
        extract "$tarfile" &&
        ln -s "$file-$vrsn" "$file"
        ) || exit 1
    fi
done
)

if [ $? = 0 ]
then
    mkdir ${GCC_VER}-obj
    cd ${GCC_VER}-obj
    ../${GCC_VER}/configure --prefix="${TGT_DIR}" \
        CC="${CC}" \
        CXX="${CXX}"
    make -j8 bootstrap
fi

Script nbncl— 非空白、非注释行

#!/usr/bin/env perl
#
# Non-blank, non-comment lines only

use warnings;
use strict;

while (<>)
{
    chomp;
    s/\s+$//;
    s/\s*#.*$//;
    print "$_\n" unless /^$/;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OS X 10.11 上构建 GCC 的相关文章

随机推荐

  • 在 ruamel.yaml 迭代期间获取评论

    当我迭代 YAML 对象时如何获取注释 yaml YAML with open path r as f yaml data yaml load f for obj in yaml data how to get the comments h
  • Wordpress 的 nginx 配置位于同一服务器的 Rails 应用程序的子目录中

    当我尝试访问 example com blog 时 我不断收到 文件未找到 错误 并且在 var log nginx error log FastCGI sent in stderr Primary script unknown while
  • 返回一个随机偶数

    我有以下几种方法 rnd 方法返回两个边界之间的单个随机整数 Create next batch of 55 random numbers void advance random int j1 double new random for j
  • 文件上传控制和 GWT 外观

    我正在编写我的第一个 GWT 项目 我有一个带有标签 文件上传控件和上传按钮的表单 但它们在各种网络浏览器中看起来很糟糕并且差异很大 另外 文件上传控件中的按钮与 GWT 按钮控件的样式不同 另一个问题是 在 Chrome 中 文件选择按钮
  • Android Widget 在更新期间显示奇怪的图像

    我这里有一个奇怪的 我有一台配备 Nextel 的 Motorola i1 运行 Android 1 5 我有一个安卓小部件 当我开始运行更新此小部件的服务时 我看到来自另一个小部件的图像 启动 DC Contact 它在我的小部件的位置显
  • 使用 Newton-Raphson 方法在 C 中求平方根

    在下面的代码中 我想将终止条件替换为 如果猜测平方与x的比率接近1 则while循环应该终止 我尝试了各种表达式 但没有一个能够正确运行代码 有什么建议吗 include
  • R:带有 geom_map 的 ggplot2 返回“x 和单位必须具有长度 > 0”错误,尽管值已转换为因子

    我正在开发一个原始的闪亮应用程序 它将映射来自苏格兰开放数据项目 我制定了 SPARQL 查询 用于生成类似于下面提供的摘录的数据框 dz label overall quantiles S010001 8 S010002 9 我有强化的形
  • 从 XCode 调用本地 HTML 文件时出现问题

    这是我的 WebView 代码 webView loadRequest NSURLRequest requestWithURL NSURL fileURLWithPath NSBundle mainBundle pathForResourc
  • Android SpeechRecognizer 只能在应用程序的主线程中使用

    我正在尝试将一些 Android 语音 API 集成到我的基于 AndEngine 的游戏中 我将代码放在 BaseGame 活动中 但是在运行时出现此错误 05 06 23 51 28 955 错误 AndroidRuntime 553
  • 4D 到 3D 透视投影

    我正在尝试计算 3D 世界中 4D 点的位置 我从 2D 开始 尝试将其扩展到 3D 然后再扩展到 4D 首先 我发现计算直线上二维点的投影位置很容易 Whoops there should be in the first equation
  • 如何在 Dart 中替换 unicode 转义字符

    我需要清理具有转义字符的字符串 但无法这样做 这是我的测试代码 test Replace unicode escape character String originalText Jeremiah 52 1 u201334 String r
  • 为初学者保护 PHP 表单?资源?

    我成功构建了第一个 html PHP 表单 该表单使用 POST 全局变量在多个页面之间传递变量 然后使用 mail 函数将结果通过电子邮件发送给我 我确信这种形式非常不安全 因为它现在很容易受到各种攻击 我想知道如何修补这些漏洞 但我几乎
  • Java错误路径中没有lwjgl64?

    我正在尝试制作一个游戏 它在 eclipse 中运行良好 但是当我将其导出并作为 jar 文件运行时 出现此错误 Exception in thread main java lang UnsatisfiedLinkError no lwjg
  • 这里建议API返回PARSING_ERROR

    从昨天开始 我们用于获取地点建议的 Here API 系统地返回 PARSING ERROR 状态页面在这里https status here com status说一切都很好 那可能是什么问题呢 我们的代码几周以来一直在运行 if fro
  • 无法使用字符串在 PowerShell 中设置别名

    我尝试通过运行在 PowerShell 中设置别名Set Alias Name artisan Value php aritsan 虽然命令运行成功 但是当我调用别名时 出现以下错误 artisan The term php aritsan
  • 使用 iPhone 和 iPad 的 Safari 中的传单地图问题

    我在 iPhone 和 iPad 中使用 Safari 浏览传单地图时遇到一些奇怪的问题 我正在使用 AJAX GET 请求来获取地图上的标记并在获取时绑定弹出内容 在弹出窗口中 我有一个按钮 当用户单击它以查看详细信息时 该按钮会打开引导
  • 如何使用 VoiceOver 逐段阅读 UITextView?

    我正在为盲人编写一个应用程序 并想在其主页上放置一些说明 该指令是多段静态文本 我把它放在 UITextView 中 我希望盲人用户能够使用 VoiceOver 逐段阅读说明 但是 当用户将 VoiceOver 焦点移到 UITextVie
  • 运行梁管道时,“PBegin”对象没有属性“windowing”

    我在运行数据流作业时发现 PBegin 对象没有属性 windowing 我在 pardo 函数中调用 connectclass 类 我正在尝试从 Beam python SDK 连接 NOSQL 数据库并运行 sql 从表中提取数据 然后
  • 帮助!如何在月份更改后在 UI 日期选择器中启用日期?

    在我的情况下 我得到了想要从 ajax 调用启用的日子 当我更改月份时 我读取了 ajax 调用的 xml 文件并获取了该月的天数 如何计算出来 非常感谢 保存日期的数组变量 var daysWithRecords new Array 加载
  • 在 OS X 10.11 上构建 GCC

    在 OS X 10 11 1 上使用命令行构建 GCC 最新版本 gccx configure with gmp opt local with mpfr opt local with mpc opt local with libiconv