来自重新编译libiconv的代码段,gettext未定义的符号发生在已经成功安装之后;想把它变成自己的问题。
尝试在简单的.c
文件中使用libiconv
:
#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;
}
如果我没有为gcc
指定-m32
,则我收到以下错误:
$ 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
当您"安装"库时,该库已经构建,安装无法更改它是32位库还是64位库。
控制库是32位还是64位(或者两者都适用,如果您使用的是macOS Sierra或Mac OS X(的是对象文件的编译方式。如果使用gcc -m32
进行编译,则对象文件将为32位,库将为32位数;如果使用-m64
进行编译,它们将是64位的。如果不使用任何选项进行编译,则会得到默认行为,而默认行为取决于平台和编译器的构建方式。如果您使用的是Mac操作系统,则可以将32位和64位版本编译为单个对象文件,然后创建一个同时包含32位和64bit的库。
从外观上看,您需要确保使用64位选项编译libiconv
。您可能需要使用./configure CC='gcc -m64' CXX=
g++-m64 …
或类似于强制64位编译的东西——这是我有时使用的技巧。