当前位置: 技术问答>linux和unix
请问:linux 下 如何在一个动态库(so文件)中到处 C++类?感激不尽!
来源: 互联网 发布时间:2015-12-20
本文导语: 如题。有知道的大哥帮帮忙。 | 和C函数没有什么不同。假设你要导出的函数为func,类为myclass 1.正常编译C++动态连接库(同C动态连接库一样)。 2.C函数在动态库中的函数名是_func,而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)里面的函数永远没有不同。
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