Как связать реализацию iconv в glibc? - PullRequest
4 голосов
/ 17 января 2011

Библиотека GNU C предоставляет реализацию iconv - как мне ее использовать?

Простая программа:

#include <iconv.h>

int main( int argc, char **argv ) {
        iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" );
        iconv_close( cd );
        return 0;
}

Компиляция и ссылка:

$ gcc -Wall iconv.c -o iconv
/tmp/ccKAfXNg.o: In function `main':
iconv.c:(.text+0x19): undefined reference to `libiconv_open'
iconv.c:(.text+0x29): undefined reference to `libiconv_close'
collect2: ld returned 1 exit status

Перечислите символы, чтобы показать, что они существуют!

$ nm -D /lib/libc-2.12.1.so | grep iconv
00017920 T iconv
00017ae0 T iconv_close
00017720 T iconv_open

Если я установлю библиотеку GNU libiconv в / usr / local и свяжусь с -liconv, это сработает.Как мне связать с реализацией glibc iconv?

РЕДАКТИРОВАТЬ: дополнительная информация, запрошенная из комментариев:

Список всех файлов iconv.h в / usr (1 совпадение)

$ find /usr/ | grep "iconv\.h"
/usr/include/iconv.h

Переустановите libc6-dev, чтобы убедиться, что установлен правильный заголовок.

$ dpkg -S /usr/include/iconv.h 
libc6-dev: /usr/include/iconv.h
$ apt-get install --reinstall libc6-dev
Reading package lists... Done                                                                                                                                                                                                                  
Building dependency tree                                                                                                                                                                                                                       
Reading state information... Done                                                                                                                                                                                                              
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.                                                                                                                                                                  
Need to get 0B/4,910kB of archives.                                                                                                                                                                                                            
After this operation, 0B of additional disk space will be used.                                                                                                                                                                                
(Reading database ... 143458 files and directories currently installed.)                                                                                                                                                                       
Preparing to replace libc6-dev 2.12.1-0ubuntu10.1 (using .../libc6-dev_2.12.1-0ubuntu10.1_i386.deb) ...                                                                                                                                        
Unpacking replacement libc6-dev ...                                                                                                                                                                                                            
Setting up libc6-dev (2.12.1-0ubuntu10.1) ...

Скомпилируйте и снова скомпонуйте с помощью предложенного параметра препроцессора:

$ gcc -Wall -DLIBICONV_PLUG iconv.c -o iconv
/tmp/ccKAfXNg.o: In function `main':
iconv.c:(.text+0x19): undefined reference to `libiconv_open'
iconv.c:(.text+0x29): undefined reference to `libiconv_close'
collect2: ld returned 1 exit status

Вывод из gcc -H:

$ gcc -H iconv.c 
. /usr/include/iconv.h
.. /usr/include/features.h
... /usr/include/bits/predefs.h
... /usr/include/sys/cdefs.h
.... /usr/include/bits/wordsize.h
... /usr/include/gnu/stubs.h
.... /usr/include/bits/wordsize.h
.... /usr/include/gnu/stubs-32.h
.. /usr/lib/gcc/i686-linux-gnu/4.4.5/include/stddef.h
Multiple include guards may be useful for:
/usr/include/bits/predefs.h
/usr/include/gnu/stubs-32.h
/usr/include/gnu/stubs.h
/usr/lib/gcc/i686-linux-gnu/4.4.5/include/stddef.h

Фастбиновая копия /usr/include/iconv.h

Исправлено: перезагрузка исправила проблему.Я подозреваю, что кешированная копия libiconv вызывала конфликты, даже если она была удалена с диска.

1 Ответ

7 голосов
/ 17 января 2011

Ваша программа выглядит нормально и прекрасно компилируется в моей системе (Mandriva Linux 2010.1).

Я нахожу libiconv_* ссылки в вашем журнале компиляции тревожными. Вы уверены, что включенная версия iconv.h поступает от glibc, а не от отдельной реализации libiconv, такой как GNU libiconv? Звучит так, как будто он добавляет префикс lib ко всем функциям iconv, чтобы избежать столкновений символов с реализацией iconv библиотеки C, поставляемой с системой.

Наличие явной ссылки на libiconv также указывает на отдельную реализацию iconv - glibc в этом не нуждается.

EDIT:

Для справки, я только что проверил, что использование заголовочного файла iconv.h из libiconv без явной ссылки на него даст именно тот результат, который вы видите - он переименовывает все функции iconv, добавляя префикс lib к их именам .

...