Search code examples
c++makefilelinkerstatic-linkingdynamic-linking

undefined reference to `dp_lib_init()`


I'm trying to use Linux TTY Driver Ver 1.0.15.0 of this product.

I did all the steps in README_Ubuntu, copying header files in my project dir.

However, it failes to compile, complaining that

/tmp/ccH3NfSt.o: In function `main':
main.cpp:(.text+0x5): undefined reference to `dp_lib_init()'
collect2: error: ld returned 1 exit status

To compile my main.cpp, I used

$ g++ -L/usr/lib -lsdxio main.cpp

// Same result
$ g++ -lsdxio main.cpp

// Same result
$ g++ -L-lsdxio main.cpp

My main.cpp is,

#include <iostream>
#include "sdxmng.h"
#include "sdxsio.h"

int main()
{
    dp_lib_init();

    return 0;
}

I verified that the shared library is in /usr/lib

-rwxr-xr-x 1 root root 261392 Sep 13 10:53 libsdxio.so
-rwxr-xr-x 1 root root 261392 Sep 13 20:34 libsdxio.so1.0.9.0
-rwxr-xr-x 1 root root 261392 Sep 13 10:53 libsdxio.so.9

Some helpful information

$ g++ -L/usr/lib -lsdxio main.cpp -Xlinker --verbose

    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o succeeded
    /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o succeeded
    /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o succeeded
    /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o
    attempt to open /usr/lib/libsdxio.so succeeded
    -lsdxio (/usr/lib/libsdxio.so)
    attempt to open /tmp/ccKEcpaB.o succeeded
    /tmp/ccKEcpaB.o
    attempt to open /usr/lib/libstdc++.so failed
    attempt to open /usr/lib/libstdc++.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so succeeded
    -lstdc++ (/usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so)
    attempt to open /usr/lib/libm.so failed
    attempt to open /usr/lib/libm.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libm.so failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libm.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libm.so succeeded
    opened script file /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libm.so
    opened script file /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libm.so
    attempt to open /lib/x86_64-linux-gnu/libm.so.6 succeeded
    /lib/x86_64-linux-gnu/libm.so.6
    attempt to open /usr/lib/x86_64-linux-gnu/libmvec_nonshared.a succeeded
    attempt to open /lib/x86_64-linux-gnu/libmvec.so.1 succeeded
    /lib/x86_64-linux-gnu/libmvec.so.1
    attempt to open /usr/lib/libgcc_s.so failed
    attempt to open /usr/lib/libgcc_s.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libgcc_s.so succeeded
    -lgcc_s (/usr/lib/gcc/x86_64-linux-gnu/5/libgcc_s.so)
    attempt to open /usr/lib/libgcc.so failed
    attempt to open /usr/lib/libgcc.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.so failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.a succeeded
    attempt to open /usr/lib/libc.so failed
    attempt to open /usr/lib/libc.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libc.so failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libc.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libc.so succeeded
    opened script file /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libc.so
    opened script file /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libc.so
    attempt to open /lib/x86_64-linux-gnu/libc.so.6 succeeded
    /lib/x86_64-linux-gnu/libc.so.6
    attempt to open /usr/lib/x86_64-linux-gnu/libc_nonshared.a succeeded
    (/usr/lib/x86_64-linux-gnu/libc_nonshared.a)elf-init.oS
    attempt to open /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 succeeded
    /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    attempt to open /usr/lib/libgcc_s.so failed
    attempt to open /usr/lib/libgcc_s.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libgcc_s.so succeeded
    -lgcc_s (/usr/lib/gcc/x86_64-linux-gnu/5/libgcc_s.so)
    attempt to open /usr/lib/libgcc.so failed
    attempt to open /usr/lib/libgcc.a failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.so failed
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.a succeeded
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o succeeded
    /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o
    attempt to open /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o succeeded
    /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
    libm.so.6 needed by /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so
    found libm.so.6 at /lib/x86_64-linux-gnu/libm.so.6
    ld-linux-x86-64.so.2 needed by /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so
    found ld-linux-x86-64.so.2 at /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    libgcc_s.so.1 needed by /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so
    found libgcc_s.so at /usr/lib/gcc/x86_64-linux-gnu/5/libgcc_s.so
    /tmp/ccKEcpaB.o: In function `main':
    main.cpp:(.text+0x5): undefined reference to `dp_lib_init()'
    collect2: error: ld returned 1 exit status
$ ld -lsdxio --verbose

    ==================================================
    attempt to open //usr/local/lib/x86_64-linux-gnu/libsdxio.so failed
    attempt to open //usr/local/lib/x86_64-linux-gnu/libsdxio.a failed
    attempt to open //lib/x86_64-linux-gnu/libsdxio.so failed
    attempt to open //lib/x86_64-linux-gnu/libsdxio.a failed
    attempt to open //usr/lib/x86_64-linux-gnu/libsdxio.so failed
    attempt to open //usr/lib/x86_64-linux-gnu/libsdxio.a failed
    attempt to open //usr/local/lib64/libsdxio.so failed
    attempt to open //usr/local/lib64/libsdxio.a failed
    attempt to open //lib64/libsdxio.so failed
    attempt to open //lib64/libsdxio.a failed
    attempt to open //usr/lib64/libsdxio.so failed
    attempt to open //usr/lib64/libsdxio.a failed
    attempt to open //usr/local/lib/libsdxio.so failed
    attempt to open //usr/local/lib/libsdxio.a failed
    attempt to open //lib/libsdxio.so failed
    attempt to open //lib/libsdxio.a failed
    attempt to open //usr/lib/libsdxio.so succeeded
    -lsdxio (//usr/lib/libsdxio.so)
    libm.so.6 needed by //usr/lib/libsdxio.so
    found libm.so.6 at //lib/x86_64-linux-gnu/libm.so.6
    libpthread.so.0 needed by //usr/lib/libsdxio.so
    found libpthread.so.0 at //lib/x86_64-linux-gnu/libpthread.so.0
    libc.so.6 needed by //usr/lib/libsdxio.so
    found libc.so.6 at //lib/x86_64-linux-gnu/libc.so.6
    ld-linux-x86-64.so.2 needed by //lib/x86_64-linux-gnu/libm.so.6
    found ld-linux-x86-64.so.2 at //lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    ld: warning: cannot find entry symbol _start; not setting start address
$ nm libsdxio.so
    [...]
    0000000000007d19 T dp_lib_free
    0000000000007beb T dp_lib_init
    0000000000007e21 T dp_mapping
    [...]

Solution

  • This is a guess only, but you appear to include C headers (e.g. #include "sdxsio.h") from a C++ source file.

    It generally works well except that your C++ compiler will, by default, mangle function names. But the binary has probably been compiled by a C compiler, by default with unmangled names.

    So even though libsdxio.so contains dp_lib_init, your C++ compiler/linker will search for the mangled version of that name, to no avail.

    The solution is simple and canonical (yet ugly):

    #ifdef __cplusplus
    extern "C" {
    #endif
    #include "sdxmng.h"
    #include "sdxsio.h"
    #ifdef __cplusplus
    }
    #endif