linux 如何产生so文件,请问:linux 下 如何在一个动态库(so文件)中到处 C++类?感激不尽!...

如题。有知道的大哥帮帮忙。

|

和C函数没有什么不同。假设你要导出的函数为func,类为myclass

1.正常编译C++动态连接库(同C动态连接库一样)。

2.C函数在动态库中的函数名是_func,而C++则会添加decoration.变为类似于 _myclass@funcAXFAZB 或 _func@myclassAXFAZB ,后面的大写字母中可能包含有参数和返回值类型信息。每一个函数有一个这样的原型,包括构造函数。

3.当你使用myclass时, 包含myclass的头文件,然后在编译命令行-lmyclasslib (也像使用普通C函数库),正常在你的程序中申明使用myclass就行了。编译器会为你照顾一切的(比如生成decorated function name 并 找到正确的函数位置)。

4.如果你需要使用动态加载来使用其中的函数(dlopen,dlsym),那么,你必须自己找出库中myclass::func的符号名=_func@myclassAXFAZB 。方法也很简单,用nm命令,它可以看到ELF文件中所有的符号,T or t的为导出函数,其他符号不要看了,有些是导入符号。 这种符号如果函数原型不变,他永远不会变。

最后.关于LZ的疑问很可能来自于同windows中动态连接库(使用了MFC动态库的类的导出问题)的对照。动态连接库是很简单的Bin文件,同exe一样,只是代码(函数)和数据(常量或静态数组)的集合。代码和数据都是通过符号表识出来的,只要你知道了符号就能使用这个符号所指的代码和数据,that's it。非常简单的规则。遗憾的是,MS永远喜欢将事情复杂化,MFC类导出的问题是来源于它的动态库hell问题,简单讲就是你连我,我连他,他又连我,最后连到了地狱(无论是在运行时还是编译时)。他们的解决办法就是指出那些东西要导出,所谓的导出表(.dep或__declexport)。而linux不需要,因为我们有强大的动态连接器(ld.linux),他帮我们照顾所有的问题,也就是说,某个函数是否要导出,是由 编译时的动态连接器+运行时动态连接器最后确定。而这个代码集合(so)里面的函数永远没有不同。

|

up

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值