Linux c++ error: undefined reference to 'dlopen'

C++LinuxEclipse

C++ Problem Overview


I work in Linux with C++ (Eclipse), and want to use a library. Eclipse shows me an error:

undefined reference to 'dlopen' 

Do you know a solution?

Here is my code:

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {
    void *handle;
    double (*desk)(char*);
    char *error;

    handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
    if (!handle) {
        fputs (dlerror(), stderr);
        exit(1);
    }

    desk= dlsym(handle, "Apply");

    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }

    dlclose(handle);
}

C++ Solutions


Solution 1 - C++

You have to link against libdl, add

> -ldl

to your linker options

Solution 2 - C++

@Masci is correct, but in case you're using C (and the gcc compiler) take in account that this doesn't work:

gcc -ldl dlopentest.c

But this does:

gcc dlopentest.c -ldl

Took me a bit to figure out...

Solution 3 - C++

> this doesn't work: > > gcc -ldl dlopentest.c > But this does: > > gcc dlopentest.c -ldl >> That's one annoying "feature" for sure

I was struggling with it when writing heredoc syntax and found some interesting facts. With CC=Clang, this works:

$CC -ldl -x c -o app.exe - << EOF
#include <dlfcn.h>
#include <stdio.h>
int main(void)
{
  if(dlopen("libc.so.6", RTLD_LAZY | RTLD_GLOBAL))
    printf("libc.so.6 loading succeeded\n");
  else
    printf("libc.so.6 loading failed\n");
  return 0;
}
EOF

./app.exe

as well as all of these:

  • $CC -ldl -x c -o app.exe - << EOF
  • $CC -x c -ldl -o app.exe - << EOF
  • $CC -x c -o app.exe -ldl - << EOF
  • $CC -x c -o app.exe - -ldl << EOF

However, with CC=gcc, only the last variant works; -ldl after - (the stdin argument symbol).

Solution 4 - C++

I was using CMake to compile my project and I've found the same problem.

The solution described here works like a charm, simply add ${CMAKE_DL_LIBS} to the target_link_libraries() call

Solution 5 - C++

The topic is quite old, yet I struggled with the same issue today while compiling cegui 0.7.1 (openVibe prerequisite).

What worked for me was to set: LDFLAGS="-Wl,--no-as-needed" in the Makefile.

I've also tried -ldl for LDFLAGS but to no avail.

Solution 6 - C++

you can try to add this

LIBS=-ldl CFLAGS=-fno-strict-aliasing

to the configure options

Solution 7 - C++

You needed to do something like this for the makefile:

LDFLAGS='-ldl'
make install

That'll pass the linker flags from make through to the linker. Doesn't matter that the makefile was autogenerated.

Solution 8 - C++

I met the same problem even using -ldl.

Besides this option, source files need to be placed before libraries, see https://stackoverflow.com/questions/6183899/undefined-reference-to-dlopen.

Solution 9 - C++

In order to use dl functions you need to use the -ldl flag for the linker.

how you do it in eclipse ?

> Press Project --> Properties --> C/C++ build --> Settings --> GCC C++ Linker -->
Libraries --> in the "Libraries(-l)" box press the "+" sign --> write "dl" (without the quotes)-> press ok --> clean & rebuild your project.

Solution 10 - C++

 $gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>

A good description of why the placement of -l dl matters

But there's also a pretty succinct explanation in the docs From $man gcc

> -llibrary -l library Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.)

       It makes a difference where in the command you write this option; the
       linker searches and processes libraries and object files in the order
       they are specified.  Thus, foo.o -lz bar.o searches library z after
       file foo.o but before bar.o.  If bar.o refers to functions in z,
       those functions may not be loaded.

      

Solution 11 - C++

Try to rebuild openssl (if you are linking with it) with flag no-threads.

Then try to link like this:

target_link_libraries(${project_name} dl pthread crypt m ${CMAKE_DL_LIBS})

Solution 12 - C++

In earlier versions(~2.7) of GNU tool chain, glibc did not have direct interface to link loader(dlopen and dlsym functions), so you had to provide -ldl(libdl) at compile time. You don't have to do that anymore with latest glibc version. Just include and you are good to go.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser101375View Question on Stackoverflow
Solution 1 - C++MasciView Answer on Stackoverflow
Solution 2 - C++knocteView Answer on Stackoverflow
Solution 3 - C++vulcan ravenView Answer on Stackoverflow
Solution 4 - C++Lucas CoelhoView Answer on Stackoverflow
Solution 5 - C++baweyView Answer on Stackoverflow
Solution 6 - C++user2948547View Answer on Stackoverflow
Solution 7 - C++RobView Answer on Stackoverflow
Solution 8 - C++DeqingView Answer on Stackoverflow
Solution 9 - C++AmitkView Answer on Stackoverflow
Solution 10 - C++flerbView Answer on Stackoverflow
Solution 11 - C++JamesView Answer on Stackoverflow
Solution 12 - C++Gopesh BharadwajView Answer on Stackoverflow