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

use*_*375 132 c++ eclipse linux

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

undefined reference to 'dlopen' 
Run Code Online (Sandbox Code Playgroud)

你知道解决方案吗?

这是我的代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

Mas*_*sci 234

你必须链接libdl,添加

-ldl

到您的链接器选项

  • 哈,好吧,对于有这个问题的其他人,使用上面的路径,除了去Libraries而不是Miscellaneous并添加'dl' (3认同)
  • 我遇到了同样的问题...我在链接器标志文本字段的项目>属性> C/C++构建>设置>(我的链接器)>杂项下添加了编译器标志.它没有做任何事. (2认同)
  • 这个答案有帮助。对于任何想要找到 libdl.so 位置的人,只需转到根目录并键入 `locate libdl.so` (2认同)

kno*_*cte 63

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

gcc -ldl dlopentest.c
Run Code Online (Sandbox Code Playgroud)

但这样做:

gcc dlopentest.c -ldl
Run Code Online (Sandbox Code Playgroud)

我想了一下......

  • 我发现选项的顺序也很重要.在使用sqlite3的项目中,我必须在-lsqlite3之后放入-ldl(和-lpthread).不知道那是什么,如果我只是RTFM,我肯定答案就在那里. (2认同)

vul*_*ven 11

这不起作用:

gcc -ldl dlopentest.c
Run Code Online (Sandbox Code Playgroud)

但这确实:

gcc dlopentest.c -ldl
Run Code Online (Sandbox Code Playgroud)

这肯定是一个令人讨厌的“功能”

我在编写 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
Run Code Online (Sandbox Code Playgroud)

以及所有这些:

  • $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之后-(标准输入参数符号)。


小智 7

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

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

我也试过-ldlLDFLAGS,但无济于事.


Luc*_*lho 7

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

这里描述的解决方案就像一个魅力,只需将 ${CMAKE_DL_LIBS} 添加到 target_link_libraries() 调用

  • 谢谢!这也对我有帮助。但只有在我将编译器更改为 clang `SET(CMAKE_CXX_COMPILER /usr/bin/clang++)` 之后。在我的 Ubuntu 上使用 /usr/bin/c++ 它不起作用...(另请参阅 vulcan raven 的答案) (2认同)

use*_*547 5

你可以尝试添加这个

LIBS=-ldl CFLAGS=-fno-strict-aliasing
Run Code Online (Sandbox Code Playgroud)

到配置选项