来自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
答案 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位编译 - 这是我有时会使用的技巧。