undefined reference to `dlopen'

lidengdeng 2009-09-15 08:23:24
我用的是ubuntu8.04, 在eclipse下面开发C++程序

o_pModule = dlopen( "./libclassifier.so.1.0", RTLD_LAZY);
m_pLoadModel = (void(*)(char*)) dlsym( o_pModule, "ClaLoadModel" );

在C++代码里调用动态库时出现如下的错误:
undefined reference to `dlopen'
undefined reference to `dlsym'
undefined reference to `dlsym'

请问如何解决? 望详细点, 谢谢
...全文
19420 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
harhart 2012-08-10
  • 打赏
  • 举报
回复
学习了。LZ不厚道啊。
  • 打赏
  • 举报
回复
给你个例子看看:
#include <stdio.h> //filename:myso.c
#include <stdlib.h>
void show() {
printf("Standard Object by gashero/n");
}
void set(int *data)
{
*data = 12;
}
编译: gcc -fpic -shared -o myso.so myso.c
#include <stdio.h> //filename:main.c
#include <dlfcn.h>
int main()
{
int data=0;
void* handl;
char* error;
void (*fun1)();
void (*fun2)(int*data);
handl=dlopen("./myso.so",RTLD_LAZY);
error=dlerror();
if(error)
{
printf("lib load error:%s\n",error);
exit(1);
}
fun1=dlsym(handl,"show");
error=dlerror();
if(error)
{
printf("lib load error:%s\n",error);
exit(1);
}
fun1();
fun2=dlsym(handl,"set");
dlerror();
fun2(&data);
printf("\n%d\n",data);
dlclose(handl);
}
编译:gcc -o dlltest main.c –ldl
messi 2012-01-12
  • 打赏
  • 举报
回复
-ldl和extern "C"是使用dlopen最常见的错误,ls各位说的很有道理。学习了。。。
bubyt1 2011-10-26
  • 打赏
  • 举报
回复
不太熟悉Linux 学习了。、
bailu1121 2011-07-14
  • 打赏
  • 举报
回复
谢谢。搞定。
玖五二七 2011-06-07
  • 打赏
  • 举报
回复
找找你的eclipse工程设置, 需要添加 -ldl, Link "dl" library
正如 xiaocai0001 所说 此为正解
玖五二七 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaocai0001 的回复:]

引用楼主 lidengdeng 的回复:
我用的是ubuntu8.04, 在eclipse下面开发C++程序

o_pModule = dlopen( "./libclassifier.so.1.0", RTLD_LAZY);
m_pLoadModel = (void(*)(char*)) dlsym( o_pModule, "ClaLoadModel" );

在C++代码里调用动……
[/Quote]

肯定是这个问题,我也是这样解决问题的
telecom2008 2010-11-05
  • 打赏
  • 举报
回复
对LZ真实无语了,搞定了,也应该说说是怎么搞定的呀;这么多人为你忙碌,给你出注意;结果搞定了,就拍屁股走人了。最起码你得在这里总结一下吧,真实有始无终!!
lidengdeng 2009-09-15
  • 打赏
  • 举报
回复
搞定了, 谢谢大家
aizibion 2009-09-15
  • 打赏
  • 举报
回复
就说lbfgs这个符号没找到哈,多仔细走查下代码,很快会有结果的
xiaocai0001 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 lidengdeng 的回复:]
我用的是ubuntu8.04, 在eclipse下面开发C++程序

o_pModule = dlopen( "./libclassifier.so.1.0", RTLD_LAZY);
m_pLoadModel = (void(*)(char*)) dlsym( o_pModule, "ClaLoadModel" );

在C++代码里调用动态库时出现如下的错误:
undefined reference to `dlopen'
undefined reference to `dlsym'
undefined reference to `dlsym'

请问如何解决? 望详细点, 谢谢
[/Quote]

跟头文件没有多大关系, 这个很显然是Link时候的错误, 如果没有头文件的话, 会报compile错误.

找找你的eclipse工程设置, 需要添加 -ldl, Link "dl" library
lidengdeng 2009-09-15
  • 打赏
  • 举报
回复
现在是能够通过编译了

但是在o_pModule = dlopen( "./libclassifier.so.1.0", RTLD_LAZY); 时o_pModule返回的是空值, dlerror()为下面的错误

undefined symbol: lbfgs_
aizibion 2009-09-15
  • 打赏
  • 举报
回复
我想,你的#include <dlfcn.h> 估计有问题,多贴点代码,最好把这个cpp贴全了看看
dclchj 2009-09-15
  • 打赏
  • 举报
回复
我自已说的没网友好,这个更详细:
在使用厂商新提供的库文件时,遇到了新问题,库中的函数程序不识别,同样的方法在使用以前的库时是可行的,在CSDN上求助并查阅一些资料后,问题已经解决。
1)使用库的时候首先要明确库(或者头文件)是用什么编写的,如果是用C++编写的,那么在MFC中可以直接使用,如果是用c编写的,那么在#include头文件的时候要加上
extern “C”{
#include “OOXX.h”
}
注意格式换行要正确。
2)为什么要如1)中那样操作呢,因为在c++中编译的方法和c不用,这是由于函数的重载造成的。在c中不涉及重载,如函数func(int a,float b)编译成_func.在c++中涉及重载,如果只凭函数名是不足以判断是使用的哪个函数,所以编译的时候要加上变量,如函数func(int a,float b)编译成_func_int_float,这样不但确定了函数名,还确定了使用哪中重载。正式由于以上的不同,使得c中编的函数不能在c++中直接使用,c++中为了兼容c的代码,提出了extern “C”的方法,在编译声明了extern “C”的函数函数时,会按照c语言的方法编译。
如果不加extern “C”,在编译的时候会出现link错误:error link 2001:unresolved extern symbol “long __stdcall func(int a,float b)@QDASCFQAE@”之类的错误,说明编译器没有识别出函数func
lidengdeng 2009-09-15
  • 打赏
  • 举报
回复
详细里啊, 怎样在编译选项里添加 -ldl啊?
dclchj 2009-09-15
  • 打赏
  • 举报
回复
由于dlsym被设计成c-style方式,因此调用c++定义的函数时,需要加上extern "C"

下面引用网友:
在C++代码中调用C的库文件,需加上extern "C",用来告知编译器:这是一个用C写成的库文件,请用C的方式连接他们。
Undefined reference to 错误:这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题.
aizibion 2009-09-15
  • 打赏
  • 举报
回复
编译选项里加 -ldl了吗?
lidengdeng 2009-09-15
  • 打赏
  • 举报
回复
#include <dlfcn.h>
有的有的

aizibion 2009-09-15
  • 打赏
  • 举报
回复
#include <dlfcn.h> //这个有了吗?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧