Linux c ++错误:对'dlopen'的未定义引用

时间:2009-06-05 15:49:59

标签: c++ linux eclipse

我使用C ++(Eclipse)在Linux中工作,并希望使用库。 Eclipse向我显示错误:

undefined reference to 'dlopen' 

你知道解决方案吗?

这是我的代码:

#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);
}

11 个答案:

答案 0 :(得分:221)

你必须链接libdl,添加

  

-ldl

到您的链接器选项

答案 1 :(得分:59)

@Masci是正确的,但如果您使用C(和gcc编译器),请考虑到这不起作用:

gcc -ldl dlopentest.c

但这样做:

gcc dlopentest.c -ldl

我想了一下......

答案 2 :(得分:7)

主题已经很老了,但是我在编译cegui 0.7.1(openVibe先决条件)时遇到了同样的问题。

对我有用的是设置:LDFLAGS="-Wl,--no-as-needed" 在Makefile中。

我还为-ldl尝试LDFLAGS,但无济于事。

答案 3 :(得分:3)

你需要为makefile执行类似的操作:

LDFLAGS='-ldl'
make install

这会将链接器标志从make传递到链接器。 makefile是自动生成的并不重要。

答案 4 :(得分:3)

您可以尝试添加此

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

到配置选项

答案 5 :(得分:3)

  

这不起作用:

gcc -ldl dlopentest.c
     

但是这样做:

gcc dlopentest.c -ldl
     
    

那肯定是一个令人讨厌的“特征”

  

在编写heredoc语法时,我一直在苦苦挣扎,发现了一些有趣的事实。使用CC=Clang,可以使用:

$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

以及所有这些:

  • $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

但是,对于CC=gcc,只有最后一个变体有效; -ldl之后的-(stdin参数符号)。

答案 6 :(得分:2)

我正在使用CMake编译我的项目,但我发现了同样的问题。

here中描述的解决方案就像一个咒语,只需在$ target_link_libraries()调用中添加$ {CMAKE_DL_LIBS}

答案 7 :(得分:1)

即使使用-ldl我也遇到了同样的问题。

除此选项外,源文件需要放在库之前,请参阅undefined reference to `dlopen'

答案 8 :(得分:1)

为了使用dl函数,您需要为链接器使用-ldl标志。

你是如何在日食中做到的?

  

项目 - &gt; 属性 - &gt; C / C ++构建 - &gt; 设置 - &gt; GCC C ++链接器 - &gt;
图书馆 - &gt;   在&#34;图书馆(-l)&#34;框按&#34; +&#34;标志 - &gt;写&#34; dl &#34; (不含引号) - &gt;按确定 - &gt; 清洁&amp;重建您的项目。

答案 9 :(得分:1)

 $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

但是在文档中也有一个非常简洁的解释 来自$ 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.

答案 10 :(得分:0)

尝试使用标志no-threads重建openssl(如果正在与其链接)。

然后尝试这样链接:

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