How to link glibc iconv implementation?

The GNU C library provides an implementation of iconv - how can I use it?

Simple program:

#include <iconv.h> int main( int argc, char **argv ) { iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" ); iconv_close( cd ); return 0; } 

Compile and link:

 $ 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 

List the characters to show that they exist!

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

If I installed the GNU libiconv library in / usr / local and the link to -liconv, it will work. How to link with glibc iconv implementation?

EDIT: additional information on request:

List of all iconv.h files in / usr (1 match)

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

Reinstall libc6-dev to verify that the correct header is set.

 $ 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) ... 

Compile and again the link with the proposed preprocessor option:

 $ 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 

Exiting 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 

copy pastbin / usr / include / iconv.h

Bugfix: Reboot fixed the problem. I suspect that the cached copy of libiconv was causing conflicts, even if it was removed from disk.

+4
source share
1 answer

Your program seems beautiful and compiles fine on my system (Mandriva Linux 2010.1).

I find the libiconv_* links in your compilation log libiconv_* . Are you sure that the version of iconv.h that is included comes from glibc, and not from a separate libiconv implementation, such as GNU libiconv? It sounds like it adds the lib prefix to all the iconv functions to avoid character collisions with the iconv implementation of the C library included in the system.

To explicitly reference libiconv points to a separate implementation of iconv - glibc does not need it.

EDIT:

For the record, I just checked that using the iconv.h header file from libiconv without explicitly linking to it will produce the exact result you see - it renames all iconv functions by adding the lib prefix to their names.

+7
source

Source: https://habr.com/ru/post/1335775/


All Articles