【问题标题】:libiconv and MacOSlibiconv 和 MacOS
【发布时间】:2012-09-19 03:12:48
【问题描述】:

我正在尝试在 Mac OS X Lion 中编译 GCC 4.5.1。

我对 libiconv 有疑问。首先它抱怨架构 x86_64 的未定义符号,它们是:_iconv、_iconv_open 和 _iconv_close。我发现 MacPorts 版本的 libiconv 将它们重命名为:_libiconv、_libiconv_open 和 _libiconv_close。所以我链接到 /usr/lib 中的 Mac OS 本机 libiconv 而不是 /opt/local/lib 中的 MacPorts 库。

Undefined symbols for architecture x86_64:
"_iconv", referenced from:
  _convert_using_iconv in libcpp.a(charset.o)
  __nl_find_msg in libintl.a(dcigettext.o)
 (maybe you meant: __cpp_destroy_iconv, _cpp_init_iconv )
"_iconv_close", referenced from:
  __cpp_destroy_iconv in libcpp.a(charset.o)
  __cpp_convert_input in libcpp.a(charset.o)
  __nl_free_domain_conv in libintl.a(loadmsgcat.o)
"_iconv_open", referenced from:
  _init_iconv_desc in libcpp.a(charset.o)
  __nl_init_domain_conv in libintl.a(loadmsgcat.o)

但是,在这样做之后,我尝试从头开始重建它(清理和一切),但后来它在不同的地方抱怨未定义的符号,但这次是 _libiconv、_libiconv_open 和 _libiconv_close。

Undefined symbols for architecture x86_64:
  "_libiconv", referenced from:
    _identifier_to_locale in libbackend.a(pretty-print.o)
  "_libiconv_close", referenced from:
    _identifier_to_locale in libbackend.a(pretty-print.o)
  "_libiconv_open", referenced from:
    _identifier_to_locale in libbackend.a(pretty-print.o)

有什么想法可以解决这个问题吗?我找到了一些从 MacPorts 卸载 libiconv 的解决方案,但我不想这样做,因为我有很多依赖于它的端口。

【问题讨论】:

  • 你最后是怎么解决的?

标签: gcc osx-lion iconv libiconv


【解决方案1】:

看起来您的make clean 实际上并未从构建目录中删除libbackend.a;您仍在尝试链接针对 MacPorts 编译的旧版本代码。手动运行 rm libbackend.a(或 make distcleanmake spotless 或任何应该真正清理所有内容的东西)可能会解决问题,对吧?

【讨论】:

    【解决方案2】:

    我通过包含来自/usr/lib/opt/local/lib 的两个libiconv 来解决这个问题。这是一种解决方法,如果有人有更好的解决方案,请发布。假设[gcc-src]是gcc的源目录。我所做的如下:

    1. /usr/lib复制 libiconv.*libiconv1.*
    2. 转到[gcc-src]/gcc/Makefile.in
      改变 LIBINTL = @LIBINTL@LIBINTL = @LIBINTL@ -L/opt/local/lib -liconv -L/usr/lib -liconv1
    3. 配置者:CC=gcc-mp-4.7 CXX=g++-mp-4.7 ../gcc-4.7.2/configure --with-gmp=/opt/local --enable-languages=c,c++ --enable-checking=release —prefix=[gcc-src]
    4. make
    5. make install 二进制文件位于[gcc-src]/bin/

    【讨论】:

      【解决方案3】:

      我解决了:

      $ sudo port -f deactivate libiconv
      $ ...build my project...
      $ sudo port activate libiconv
      

      可能有更好的方法,但我没有直接使用 GCC,所以这有助于作为临时解决方法。

      【讨论】:

        【解决方案4】:

        尽管这是一个旧线程,但以下解决方案可能会帮助搜索历史问题的人寻求帮助。这是一个简单的单行命令,可以使用 sed 解决问题,以更正所有 iconv 函数引用。

        $ tar xf gcc-6.4.0.tar.gz
        $ cd gcc=6.4.0
        $ # convert iconv(..)       --> _libiconv(..)
        $ # convert iconv_open(..)  --> _libiconv_open(..)
        $ # convert iconv_close(..) --> _libiconv_close(..)
        $ LC_ALL=C time \
            sed -i.bak -e 's@\(iconv[^\(]*(\)@_lib\1@g' \
            $(grep -l -r 'iconv[^\(]*(' . 2>/dev/null)
        

        我在这个项目中使用了上述解决方案:https://github.com/jlinoff/gcc-6.4.0-boost-1.66

        【讨论】:

        • 谢谢,在 Mojave 上使用 Xcode 10 构建 GCC 6.3.0 第 1 阶段时,这对我有用。
        • 这确实可以编译 git(感谢,它变得令人沮丧)但需要稍作修改才能使其工作:首先,明确指向您的 iconv 目录。 ./configure --prefix=/usr/local/git-2.23.0 --with-iconv=/usr/local/iconv 然后像上面一样修改源但是“@_lib\1g”需要是“@lib\1g " 对我来说(没有下划线)。另外,上面的命令改动太大了,所以在 compat/precompose_utf8.c 中将这一行改回:将“libiconv_ibp cp”转回“iconv_ibp”
        • 实际上,为了解决 iconv lib 错误而更改 git 的源代码让我非常困扰,我进一步深入研究并通过 Makefile 更改将事情指向正确版本图标库。我创建了a post to explain why this is happening with iconv and how to resolve
        【解决方案5】:

        旧问题的新答案。简短的回答是您的系统上有多个 iconv 库。关于 stackoverflow 的大量相关问题并不能真正回答根本问题,因此我创建了一个答案 over here,它深入解释了正在发生的事情以及如何解决。

        【讨论】:

          猜你喜欢
          • 2013-11-14
          • 2020-02-08
          • 2012-06-05
          • 1970-01-01
          • 1970-01-01
          • 2017-03-03
          • 2014-07-03
          • 2015-10-13
          • 2013-10-12
          相关资源
          最近更新 更多