linux 把动态库(libxxx.so)进行静态链接

已举报 回答
linux 把动态库(libxxx.so)进行静态链接
问在线客服
扫码问在线客服
  • 回答数

    5

  • 浏览数

    2,983

5个回答 默认排序
  • 默认排序
  • 按时间排序

已采纳
不行的。要静态链接就要使用静态库(libxxx.a).
取消 评论
不是有include吗?
取消 评论
windows的dll文件和Linux的so文件功能是一样的
如果多个程序同时用一个库文件,可以减少体积
取消 评论
.jpg
静态图象专家组制订的静态图象压缩标准,具有很高的压缩比,使用非常广泛,可使用PhotoShop等图象处理软件创建

.gif
在各种平台的各种图形处理软件上均能够处理的,经过压缩的一种图形文件格式

.rm
Windows下的RealPlayer所支持的视频压缩文件,网上非常流行的流式视频文件,很多实时视频新闻等都是采用这种格式的,不过,最新的Windows Media Video V8已经对其发起了强大的攻势

.reg
Windows 95的系统及应用程序注册文件,这种文件虽然以纯文本文件保存,但一样存在版本问题,不同的操作系统使用的REG文件版本是不同的

.bmp
Bitmap位图文件,这是微软公司开发Paint的自身格式,可以被多种Windows和Windows NT平台及许多应用程序支持,支持32位颜色,用于为Windows界面创建图标的资源文件格式。

.dll
Windows动态连接库,几乎无处不在,但有时由于不同版本DLL冲突会造成败各种各样的问踢

.exe
可执行文件,虽然后缀名相同,但具有不同的格式和版本

.bat
批处理文件,在MS-DOS中,.bat文件是可执行文件,有一系列命令构成,其中可以包含对其他程序的调用

.com
DOS可执行命令文件,一般小于64KB

.rar
WinRAR提供的压缩文件格式,压缩率超过ZIP,同时提供的功能也更为丰富

.mp3
采用MPEG-1 Layout 3标准压缩的音频文件,是网上主要的压缩音频文件,这种文件由于具有极高的压缩率和失真低的特点,是目前音乐盗版的主要文件格式,但目前受到VQF,WMA等新标准的挑战
取消 评论
在linux上,你在ps中说的那种将动态库作为一个参数传到程序里的使用方式,是通过dlopen函数将.so加载到当前进程中,并且通过ld.so将.so链接进当前进程。这个链接过程包括:查找未定义符号在当前进程中的地址、分配数据/代码/bss段内存(数据初始化全局变量、代码段重定位)、执行constructor函数等。之后,可以使用dlsym在已知符号名的情况下通过符号名查找符号对应的地址。这个符号可以是一个全局变量、全局函数等。在你说的C++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照System V的C++ API命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern C修饰之后,变成C的函数名,则无名称修饰,便于使用。

它怎样实例化我实现的继承类?
实例化的方式和正常链接一样。例如你在之类Derived中重载了基类Base中函数virtual void foo();那么你需要在你的.so中导出一个可以new Derived()的函数,并且返回结果为Base *,这样别人可以在没有Derived定义的情况下获得运行时类型为Derived的对象。此时别人虽然只有Base *的类型,但是仍然可以和正常链接一样通过虚表查virtual void foo()的地址,从而调用你定义的foo()。
此外,如果你定义了继承类的全局变量,在加载.so的时候该全局变量会自动初始化,你也可以将这个初始化的类通过指向Base *的指针传出去。

如果有大神能解释一下windows下动态库和静态库的原理,小弟感激不尽!
和Linux差不多,不过在实现细节上有些出入。例如windows链接时要直接链接.dll需要通过链接生成这个.dll时生成的.lib,而Linux上直接链接.so即可。不过运行时链接无需这个.lib。静态库都是目标文件的压缩包。都是ELF格式。至于共享内存之类的,仅仅取决于section的属性。
取消 评论
ZOL问答 > linux 把动态库(libxxx.so)进行静态链接

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

扫码参与新品0元试用
晒单、顶楼豪礼等你拿

扫一扫,关注我们
提示

确定要取消此次报名,退出该活动?