代码之家  ›  专栏  ›  技术社区  ›  ŽaMan

重新编译libiconv,gettext未定义的符号发生在已成功安装后

  •  1
  • ŽaMan  · 技术社区  · 9 年前

    主要明显错误“ Undefined symbols for architecture x86_64 "

    如何再次成功编译?

    操作系统为Mac OS X 他们的来源。安装后注意到问题:

    • binutils 第25版 ,
    • libtool 第4.6版 ,
    • glib v2.45.2版本 ,或
    • pkgconfig 0.28版

    在安装上述任何组件之前,请重新编译 libiconv gettext 没有产生任何错误,并且都成功安装了多次。

    pkg-config --list-all 不显示 它本身 也没有 吸气管 (如果这意味着任何重要的事情)

    它本身 吸气管 是他们各自网站的直接副本。

    http://www.gnu.org/software/libiconv/#downloading

    iconv --version
    iconv (GNU libiconv 1.14)
    Copyright (C) 2000-2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Written by Bruno Haible.
    

    http://ftp.gnu.org/pub/gnu/gettext/

    gettext --version
    gettext (GNU gettext-runtime) 0.19.5.1
    Copyright (C) 1995-1997, 2000-2007 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Written by Ulrich Drepper.
    

    它本身 2014版

    正在尝试使用 它本身 在一个简单的 .c 文件:

    #include <iconv.h>
    // works: gcc -m32 -I/usr/local/include -liconv -o test-iconv.exe test-iconv.c
    // does NOT work: gcc -I/usr/local/include -liconv -o test-iconv.exe test-iconv.c
    int main(int argc, char **argv) {
        iconv_t conv = iconv_open("ISO8859-1", "UTF-8");
        if (conv != (iconv_t) -1) {
        return 0;
        }
        return 1;
    }
    

    如果我没有指定 -m32 对于 gcc 然后我收到以下错误:

    $ gcc -I/usr/local/include -liconv -o test-iconv.exe test-iconv.c
    Undefined symbols for architecture x86_64:
      "_libiconv_open", referenced from:
          _main in ccr9tTic.o
    ld: symbol(s) not found for architecture x86_64
    collect2: ld returned 1 exit status
    

    正在尝试重新编译 它本身

    libiconv-1.14 $ make distclean; ./configure --enable-extra-encodings \
      --with-libiconv-prefix=/usr/local/include; make V=1 
    ...
    ...
    ...
    gcc -DHAVE_CONFIG_H -DEXEEXT=\"\" -I. -I.. -I../lib  -I../intl \
        -DDEPENDS_ON_LIBICONV=1 -D DEPENDS_ON_LIBINTL=1 -I/usr/local/include  \
        -g -O2 -c strerror-override.c
    rm -f libicrt.a
    ar cru libicrt.a allocator.o areadlink.o careadlinkat.o malloca.o progname.o \
        safe-read.o width.o xmalloc.o xstrdup.o xreadlink.o canonicalize-lgpl.o \
        error.o lstat.o readlink.o stat.o strerror.o strerror-override.o
    ranlib libicrt.a
    cd src && make all
    gcc -c -I. -I. -I.. -I../include -I./../include -I../srclib -I./../srclib \
        -I../lib -g -O2 -I/usr/local/include -DINSTALLDIR=\"/usr/local/bin\" \
        -DLOCALEDIR=\"/usr/local/share/locale\" ./iconv_no_i18n.c
    /bin/sh ../libtool --mode=link gcc  -g -O2 iconv_no_i18n.o \
        ../srclib/libicrt.a ../lib/libiconv.la  -o iconv_no_i18n
    libtool: link: gcc -g -O2 iconv_no_i18n.o -o .libs/iconv_no_i18n \
        ../srclib/libicrt.a ../lib/.libs/libiconv.dylib
    ld: warning: ignoring file ../srclib/libicrt.a, file was built for archive 
        which is not the architecture being linked (x86_64): ../srclib/libicrt.a
    Undefined symbols for architecture x86_64:
     "_program_name", referenced from:
         _main in iconv_no_i18n.o
         _usage in iconv_no_i18n.o
         _error in iconv_no_i18n.o
     "_rpl_strerror", referenced from:
         _error in iconv_no_i18n.o
     "_safe_read", referenced from:
         _convert in iconv_no_i18n.o
     "_set_program_name", referenced from:
         _main in iconv_no_i18n.o
     "_uc_width", referenced from:
         _update_line_column in iconv_no_i18n.o
    ld: symbol(s) not found for architecture x86_64
    collect2: ld returned 1 exit status 
    make[1]: *** [iconv_no_i18n] Error 1
    make: *** [all] Error 2
    

    来自的信息 lipo :

    architecture being linked (x86_64): ../srclib/libicrt.a

    libiconv-1.14 $ lipo -info srclib/libicrt.a
    input file srclib/libicrt.a is not a fat file
    Non-fat file: srclib/libicrt.a is architecture: x86_64
    

    吸气管 版本0.19.5.1

    gettext-0.19.5.1 $ make distclean; ./configure; make V=1
    ...
    ...
    ...
    libtool: link: ( cd ".libs" && rm -f "libgnu.la" && ln -s "../libgnu.la" \
        "libgnu.la" )
    Making all in src
    gcc -DLOCALEDIR=\"/usr/local/share/locale\" -DHAVE_CONFIG_H -I. -I..  -I. \
        -I. -I.. -I../intl -I./../intl -I../gnulib-lib -I./../gnulib-lib \
        -I/usr/local/include -DINSTALLDIR=\"/usr/local/bin\" -g -O2 -c -o \
        gettext-gettext.o `test -f 'gettext.c' || echo './'`gettext.c
    /bin/sh ../libtool  --tag=CC   --mode=link gcc \
        -DINSTALLDIR=\"/usr/local/bin\" -g -O2   -o gettext gettext-gettext.o \
        ../gnulib-lib/libgrt.a ../intl/libintl.la -L/usr/local/lib -liconv \
        -R/usr/local/lib  -Wl,-framework -Wl,CoreFoundation -L/usr/local/lib \
        -liconv -R/usr/local/lib  
    libtool: link: gcc -DINSTALLDIR=\"/usr/local/bin\" -g -O2 -o .libs/gettext \
        gettext-gettext.o -Wl,-framework -Wl,CoreFoundation  \
        ../gnulib-lib/libgrt.a ../intl/.libs/libintl.dylib -L/usr/local/lib \
        -lc /usr/local/lib/libiconv.dylib
    ld: warning: ignoring file ../gnulib-lib/libgrt.a, file was built for archive
        which is not the architecture being linked (x86_64): ../gnulib-lib/libgrt.a
    Undefined symbols for architecture x86_64:
      "_close_stdout", referenced from:
          _main in gettext-gettext.o
      "_error", referenced from:
          _main in gettext-gettext.o
      "_gnu_basename", referenced from:
          _main in gettext-gettext.o  "_program_name", referenced from:
          _main in gettext-gettext.o
          _usage in gettext-gettext.o
      "_proper_name", referenced from:
          _main in gettext-gettext.o
      "_rpl_getopt_long", referenced from:
          _main in gettext-gettext.o
      "_rpl_optarg", referenced from:
          _main in gettext-gettext.o
      "_rpl_optind", referenced from:
          _main in gettext-gettext.o
      "_set_program_name", referenced from:
          _main in gettext-gettext.o
      "_xmalloc", referenced from:
          _expand_escape in gettext-gettext.o
    ld: symbol(s) not found for architecture x86_64
    collect2: ld returned 1 exit status
    make[4]: *** [gettext] Error 1
    make[3]: *** [all-recursive] Error 1
    make[2]: *** [all] Error 2
    make[1]: *** [all-recursive] Error 1
    make: *** [all] Error 2
    

    来自的信息 脂质

    architecture being linked (x86_64): ../gnulib-lib/libgrt.a

    gettext-0.19.5.1 $ lipo -info gettext-runtime/gnulib-lib/libgrt.a 
    input file gettext-runtime/gnulib-lib/libgrt.a is not a fat file
    Non-fat file: gettext-runtime/gnulib-lib/libgrt.a is architecture: x86_64
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Joubert Nel    6 年前

    可能是安装了gcc和ar的替代版本,并且它们位于标准位置(/usr/bin)之前的路径中。

    我过去也遇到过同样的问题,这篇文章帮助我排除了故障并修复了: https://www.unix.com/programming/253809-linker-errors-linking-files-os-x.html