社区
Linux/Unix社区
帖子详情
c程序调dlopen C++的动态库的问题,急!
himachao
2003-08-23 05:11:51
c程序调dlopen C++的动态库时,报符号__1c2n6FI_pv_: 参照的符号没有找到
查到原因是c++中使用了new,但又不能不用new ,这该如何解决?
new 是在c++中那个库中实现的?
...全文
185
10
打赏
收藏
c程序调dlopen C++的动态库的问题,急!
c程序调dlopen C++的动态库时,报符号__1c2n6FI_pv_: 参照的符号没有找到 查到原因是c++中使用了new,但又不能不用new ,这该如何解决? new 是在c++中那个库中实现的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fierygnu
2003-08-26
打赏
举报
回复
__1c2n6FI_pv_是被g++ mangle后的符号名。
epico
2003-08-26
打赏
举报
回复
该用动态连接库吧,应该可以解决问题的
to fierygnu:
__1c2n6FI_pv_这个函数的名字不像哪个库输出的函数
如果用so格式的话应该会自动加载库的
我只是猜测而已
fierygnu
2003-08-26
打赏
举报
回复
现在楼主的应用不是dlopen符号找不到,是dlopen在装载动态库时就出问题,这个和extern "C"没有关系。即使用extern "C"声明和定义了,一样会出现在的问题。
epico
2003-08-26
打赏
举报
回复
create 函数应该说明为c函数,并在函数表中输出
cpp文件最好生成so文件
gnu c++ :libstdc++.a
epico
2003-08-26
打赏
举报
回复
in cpp file
extern "C" void * create();
void * create (){
return new MyClass();
}
in c file :
dlopen(fp,"create");
void * myclass=create();
fierygnu
2003-08-25
打赏
举报
回复
叫什么名字也不能连接到C程序里。最好把你的主程序用C++编写,这样就可以解决问题。
himachao
2003-08-25
打赏
举报
回复
我的动态库动态连接的C++标准库叫什么名字呀?
fierygnu
2003-08-24
打赏
举报
回复
你的动态库动态连接的C++标准库在你的C主程序里没有连接,所以有这个问题。
yiyi999999999
2003-08-23
打赏
举报
回复
new用malloc,delete用free
头文件为stdlib.h
axlw
2003-08-23
打赏
举报
回复
malloc
linux下
C++
动态链接
C++
库示例
文中是linux下
C++
动态库
实现接口提供类导出的一个例子 注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用
dlopen
API动态地加载
C++
函数和类,是Unix
C++
程序
员经常碰到的
问题
。 事实上,情况偶尔有些复杂,需要一些解释。这正是写这篇mini HOWTO的缘由。 理解这篇文档的前提是对C/
C++
语言中
dlopen
API有基本的了解。 这篇HOWTO的维护链接是: http://www.isotton.com/howtos/
C++
-
dlopen
-mini-HOWTO/ 二、
问题
所在 有时你想在运行时加载一个库(并使用其中的函数),这在你为你的
程序
写一些插件或模块架构的时候经常发生。 在C语言中,加载一个库轻而易举(
调
用
dlopen
、dlsym和dlclose就够了),但对
C++
来说,情况稍微复杂。 动态加载一个
C++
库的困难一部分是因为
C++
的name mangling (译者注:也有人把它翻译为“名字毁坏”,我觉得还是不翻译好), 另一部分是因为
dlopen
API是用C语言实现的,因而没有提供一个合适的方式来装载类。 在解释如何装载
C++
库之前,最好再详细了解一下name mangling。 我推荐您了解一下它,即使您对它不感兴趣。因为这有助于您理解
问题
是如何产生的,如何才能解决它们。 1. Name Mangling 在每个
C++
程序
(或库、目标文件)中, 所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。 这些符号都是唯一的字符串,从而把各个函数在
程序
、库、目标文件中区分开来。 在C中,符号名正是函数名:strcpy函数的符号名就是“strcpy”,等等。 这可能是因为两个非静态函数的名字一定各不相同的缘故。 而
C++
允许重载(不同的函数有相同的名字但不同的参数), 并且有很多C所没有的特性──比如类、成员函数、异常说明──几乎不可能直接用函数名作符号名。 为了解决这个
问题
,
C++
采用了所谓的name mangling。它把函数名和一些信息(如参数数量和大小)杂糅在一起, 改造成奇形怪状,只有编译器才懂的符号名。 例如,被mangle后的foo可能看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。 其中一个
问题
是,
C++
标准(目前是[ISO14882])并没有定义名字必须如何被mangle, 所以每个编译器都按自己的方式来进行name mangling。 有些编译器甚至在不同版本间更换mangling算法(尤其是g++ 2.x和3.x)。 即使您搞清楚了您的编译器到底怎么进行mangling的,从而可以用dlsym
调
用函数了, 但可能仅仅限于您手头的这个编译器而已,而无法在下一版编译器下工作。 三、类 使用
dlopen
API的另一个
问题
是,它只支持加载函数。 但在
C++
中,您可能要用到库中的一个类,而这需要创建该类的一个实例,这不容易做到。 四、解决方案 1. extern "C"
C++
有个特定的关键字用来声明采用C binding的函数: extern "C" 。 用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。 因此,只有非成员函数才能被声明为extern "C",并且不能被重载。 尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被
dlopen
动态加载。 冠以extern "C"限定符后,并不意味着函数中无法使用
C++
代码了, 相反,它仍然是一个完全的
C++
函数,可以使用任何
C++
特性和各种类型的参数。
C/
C++
直接使用
动态库
dlopen
C/
C++
直接使用
动态库
dlopen
把各个版本编译成
动态库
,××。so ,提供统一的接口进行
调
用。这里使用的工具是dlxx系列函数
dlopen
void *
dlopen
(const char *filename, int flag); 装载
动态库
dlcloseint dlclose(void *handle); dlerrorchar *dlerr
Linux 使用
dlopen
加载
动态库
testfunction.c测试文件内容:此文件编译成
动态库
供应用
程序
调
用gcc testfunction.c -fPIC -shared -o libtest.so #include <stdio.h> int func(int a, int b) { printf("a=%d b=%d\n",a,b); return 0; }
dlopen
.c 应用
程序
,在
程序
中加载上面生成的库文件gcc -rdynamic -o
dlopen
dlopen
.c -ldl...
dlopen
加载
c++
函数及类
问题
所在 有时你想在运行时加载一个库(并使用其中的函数),这在你为你的
程序
写一些插件或模块架构的时候经常发生。 在C语言中,加载一个库轻而易举(
调
用
dlopen
、dlsym和dlclose就够了),但对
C++
来说,情况稍微复杂。动态加载一个
C++
库的困难一部分是因为
C++
的name mangling(译者注:也有人把它翻译为“名字毁坏”,我觉得还是不翻译好),另一部分是因为
dlopen
C
程序
中
调
用
C++
动态库
在C
程序
中是没有对象这个概念的,因此
C++
库中的d
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章