安装库时,它是`ar`,`libtool`,`ranlib`或其他一个,它决定它是32位还是64位?

时间:2015-08-12 02:09:08

标签: gcc architecture libtool ar libiconv

  

来自Recompiling libiconv, gettext undefined symbols occurring after an already successful install的片段;我想这是个问题。

尝试在简单的libiconv文件中使用.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

1 个答案:

答案 0 :(得分:0)

当你安装&#39;一个库,该库已经构建,无论是32位还是64位库,安装都无法更改。

是什么控制库是32位还是64位(或两者,如果您在macOS Sierra或Mac OS X上)是编译目标文件的方式。如果使用gcc -m32进行编译,则目标文件将为32位,库将为32位;如果你使用-m64进行编译,那么它们将是64位的。如果使用这两个选项进行编译,则会获得默认行为,默认情况取决于平台以及编译器的构建方式。如果您正在使用其中一个Mac操作系统,则可以将32位和64位版本编译为单个目标文件,然后创建包含32位和64位的库

从外观上看,您需要确保使用64位选项编译libiconv。您可能需要使用./configure CC='gcc -m64' CXX= g ++ -m64 或类似的东西来强制进行64位编译 - 这是我有时会使用的技巧。