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
到您的链接器选项
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)
我想了一下......
vul*_*ven 11
这不起作用:
Run Code Online (Sandbox Code Playgroud)gcc -ldl dlopentest.c
但这确实:
Run Code Online (Sandbox Code Playgroud)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
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中设置:
我也试过-ldl
了LDFLAGS
,但无济于事.