我使用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);
}
答案 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})