2011-01-17 2 views
4

GNU C 라이브러리는 iconv 구현을 제공합니다 - 어떻게 사용합니까?glibc의 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와 링크하면 작동합니다. iconv의 glibc 구현과 어떻게 링크합니까?

편집 : 코멘트로부터의 요청에 따라 더 많은 정보 :

목록은/usr (1 경기)의 모든 iconv.h 파일

$ 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 -H에서

$ 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 

출력 :

pastbin copy of /usr/include/iconv.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 
수정 : 재부팅 문제를 해결했습니다. libiconv의 캐시 된 사본이 디스크에서 삭제 되었더라도 충돌을 일으키는 것으로 의심됩니다.

+0

복제 할 수 없습니다. –

+0

/usr/include/iconv.h의 내용을 pastebin에 제공 할 수 있습니까? – thkala

+0

및/또는 gcc -E? –

답변

7

프로그램이 정상적으로 작동하고 시스템에서 제대로 컴파일됩니다 (Mandriva Linux 2010.1).

컴파일 로그에서 libiconv_* 참조가 걱정 스럽지만. 포함 된 버전 iconv.h을 glibc에서 가져 왔으며 GNU libiconv와 같은 별도의 libiconv 구현에서 가져 오지 않았습니까? 시스템과 함께 제공되는 C 라이브러리의 iconv 구현과 심볼 충돌을 피하기 위해 모든 iconv 함수에 접두사 lib을 추가하는 것처럼 들립니다.

명시 적으로 libiconv에 링크를 지정하면 별도의 iconv 구현을 가리킬 필요가 있습니다. glibc에는 필요하지 않습니다.

편집 : 공식적으로

, 방금 명시 적으로 정확히보고있는 결과를 얻을 것입니다 반대 연결하지 않고 libiconv에서 iconv.h 헤더 파일을 사용하는 것을 확인 - 그것은 lib 접두사를 추가하여 모든의 iconv 기능의 이름을 바꿉니다 그들의 이름에.

+0

libiconv를/usr/local에 설치하여 테스트했지만, 이후 'make uninstall'으로 제거했습니다. 볼 수있는 흔적이 없습니다. –

+0

@DrTwox : 어떤 iconv.h가 포함되는지 _verify_ 할 수 있습니까? – thkala

+0

나는 여전히/usr/local/include/iconv.h를 가지고 있다고 생각한다. –

관련 문제