title: "Undefined reference" error with shared library and ldflags
body: <p>When trying to compile my code inside QEMU using make, I get an <code>undefined reference</code> error during the linking phase. Afaik the configure parameters are correct, so the shared library should be used correctly for the linking, but maybe I have overlooked something.</p>
  
  <p>Any help would be appreciated!</p>
  
  <p>Below is a lot of additional information I already collected:</p>
  
  <hr>
  
  <p>Solution: See <a href="https://stackoverflow.com/a/19367803/1537754">Zach's answer</a></p>
  
  <p>I managed it now by adding <code>LIBS+=-lcity</code> to the <code>Makefile.target</code> file.</p>
  
  <p>Thanks to all!</p>
  
  <hr>
  
  <p>Update:</p>
  
  <p><strong><code>make V=1</code> output:</strong></p>
  
  <pre><code>cc -Werror -fPIE -DPIE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
  -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef
  -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -I/home/user/cityhash
  -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs
  -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers
  -Wold-style-declaration -Wold-style-definition -Wtype-limits
  -fstack-protector-all -I/usr/include/p11-kit-1     -I/usr/include/libpng12
  -I/usr/include/pixman-1     -I../linux-headers -I..
  -I/home/user/qemu/target-i386 -DNEED_CPU_H -I/home/user/qemu/include -pthread
  -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -O2
  -D_FORTIFY_SOURCE=2 -g  -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g
  -L/home/user/lib -Wl,-rpath=/home/user/lib -lcity -o qemu-system-x86_64 [… all
  *.o files … ] ../libqemuutil.a ../libqemustub.a   -lrt -pthread -lgthread-2.0
  -lrt -lglib-2.0    -lutil -lrbd -lrados -lbluetooth   -lcurl   -lncurses -ltinfo
  -lbrlapi  -luuid -lpng12   -ljpeg -lsasl2 -lgnutls   -lSDL   -lX11  -lz -laio
  -lpixman-1   -lm
  </code></pre>
  
  <p>This is followed by the normal error output I've written below (except for the <code>LINK</code>, which is missing in this case).</p>
  
  <hr>
  
  <p><strong>Error:</strong></p>
  
  <pre><code>~/qemu$ make
  ...
    LINK  x86_64-softmmu/qemu-system-x86_64
  my_code.o: In function `function`:
  /home/user/qemu/my_code.c:982: undefined reference to `CityHash64'
  ...
  collect2: error: ld returned 1 exit status
  make[1]: *** [qemu-system-x86_64] Error 1
  make: *** [subdir-x86_64-softmmu] Error 2
  </code></pre>
  
  <p><strong>Configure paramters:</strong></p>
  
  <pre><code>./configure [...] \
      --extra-cflags='-I/home/user/cityhash' \
      --extra-ldflags='-L/home/user/lib -Wl,-rpath=/home/user/lib -lcity'
  </code></pre>
  
  <p><strong>Folder structure:</strong></p>
  
  <pre><code>~
  ├─ cityhash/
  │  ├─ city.h
  │  └─ ...
  ├─ lib/
  │  ├─ libcity.so
  │  └─ ...
  └─ qemu/
  </code></pre>
  
  <p><strong>Header include and function usage (my_code.c):</strong></p>
  
  <pre><code>[...]
   11  #include "city.h"
  
  982  hash = CityHash64(buf, len);
  [...]
  </code></pre>
  
  <p><strong>Nm output for the shared library:</strong></p>
  
  <pre><code>~/lib$ nm libcity.so
  [...]
  0000000000000fdc T CityHash64
  [...]
  </code></pre>
  
  <p><strong>Strace output during make:</strong></p>
  
  <pre><code>~/qemu$ strace -f -o ../strace.out -- make
  [...]
  16111 stat("/home/user/lib/libcity.so", {st_mode=S_IFREG|0755, st_size=18468, ...}) = 0
  16111 open("/home/user/lib/libcity.so", O_RDONLY) = 7
  16111 fcntl(7, F_GETFD)                 = 0
  16111 fcntl(7, F_SETFD, FD_CLOEXEC)     = 0
  16111 fstat(7, {st_mode=S_IFREG|0755, st_size=18468, ...}) = 0
  16111 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaaaaad9000
  16111 lseek(7, 0, SEEK_SET)             = 0
  16111 read(7, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0`\7\0\0\0\0\0\0"..., 4096) = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 brk(0x2129000)                    = 0x2129000
  16111 lseek(7, 12288, SEEK_SET)         = 12288
  16111 read(7, "9\23\2%\25\0\2\4\1\364\0\2\4\1\2E\23\0\2\4\1\2&gt;\23\0\2\4\1\203\0\2\4"..., 4096) = 4096
  16111 lseek(7, 16384, SEEK_SET)         = 16384
  16111 lseek(7, 16384, SEEK_SET)         = 16384
  16111 lseek(7, 0, SEEK_SET)             = 0
  16111 read(7, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0`\7\0\0\0\0\0\0"..., 4096) = 4096
  16111 lseek(7, 12288, SEEK_SET)         = 12288
  16111 read(7, "9\23\2%\25\0\2\4\1\364\0\2\4\1\2E\23\0\2\4\1\2&gt;\23\0\2\4\1\203\0\2\4"..., 4096) = 4096
  16111 lseek(7, 0, SEEK_SET)             = 0
  16111 read(7, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0`\7\0\0\0\0\0\0"..., 4096) = 4096
  16111 lseek(7, 8192, SEEK_SET)          = 8192
  16111 read(7, "\6\2\233\f\7\10\0\0$\0\0\0\314\1\0\0\314\354\377\377\210\0\0\0\0A\16\20\206\2C\r"..., 4096) = 4096
  16111 lseek(7, 12288, SEEK_SET)         = 12288
  16111 lseek(7, 12288, SEEK_SET)         = 12288
  16111 lseek(7, 12288, SEEK_SET)         = 12288
  16111 lseek(7, 12288, SEEK_SET)         = 12288
  16111 read(7, "9\23\2%\25\0\2\4\1\364\0\2\4\1\2E\23\0\2\4\1\2&gt;\23\0\2\4\1\203\0\2\4"..., 4096) = 4096
  16111 lseek(7, 8192, SEEK_SET)          = 8192
  16111 read(7, "\6\2\233\f\7\10\0\0$\0\0\0\314\1\0\0\314\354\377\377\210\0\0\0\0A\16\20\206\2C\r"..., 4096) = 4096
  16111 lseek(7, 0, SEEK_SET)             = 0
  16111 read(7, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0&gt;\0\1\0\0\0`\7\0\0\0\0\0\0"..., 4096) = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  16111 lseek(7, 4096, SEEK_SET)          = 4096
  [...]
  16111 close(7)                          = 0
  [...]
  </code></pre>