title: How do I link glibc's implementation of iconv?
body: <p>The GNU C library provides an implementation of iconv - how do I use it?</p>
  
  <p>Simple program:</p>
  
  <pre><code>#include &lt;iconv.h&gt;
  
  int main( int argc, char **argv ) {
          iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" );
          iconv_close( cd );
          return 0;
  }
  </code></pre>
  
  <p>Compile and link:</p>
  
  <pre><code>$ 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
  </code></pre>
  
  <p>List the symbols to show they exist!</p>
  
  <pre><code>$ nm -D /lib/libc-2.12.1.so | grep iconv
  00017920 T iconv
  00017ae0 T iconv_close
  00017720 T iconv_open
  </code></pre>
  
  <p>If I install the GNU libiconv library to /usr/local and link with -liconv it works. How do I link with the glibc implementation of iconv?</p>
  
  <p>EDIT: More information as requested from the comments:</p>
  
  <p>List all iconv.h files in /usr (1 match)</p>
  
  <pre><code>$ find /usr/ | grep "iconv\.h"
  /usr/include/iconv.h
  </code></pre>
  
  <p>Reinstall libc6-dev to ensure the correct header is installed.</p>
  
  <pre><code>$ 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) ...
  </code></pre>
  
  <p>Compile and link again with suggested preprocessor option:</p>
  
  <pre><code>$ 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
  </code></pre>
  
  <p>Output from gcc -H:</p>
  
  <pre><code>$ 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
  </code></pre>
  
  <p><a href="http://pastebin.com/iQC1sBZq" rel="noreferrer">pastbin copy of /usr/include/iconv.h</a></p>
  
  <p>Fixed: Reboot fixed the issue. I suspect a cached copy of libiconv was causing the conflicts, even though it was deleted from disk.</p>