当前位置:  技术问答>linux和unix

创建共享库文件(.so)版本冲突问题如何解决

    来源: 互联网  发布时间:2015-05-24

    本文导语:  将一部分函数代码通过-fPIC和-shared参数编译为libxxx.so共享库,然后使用-lxxx参数来编译链接调用这些库函数的执行文件,使用正常。 现在libxxx.so有了更新,增加了新的函数,如果简单的覆盖旧so文件会造成原先编译链...

将一部分函数代码通过-fPIC和-shared参数编译为libxxx.so共享库,然后使用-lxxx参数来编译链接调用这些库函数的执行文件,使用正常。

现在libxxx.so有了更新,增加了新的函数,如果简单的覆盖旧so文件会造成原先编译链接的执行文件运行错误,于是将新的libxxx.so命名为libxxx.so.2,那么怎么才能做到现在新编译的执行文件使用libxxx.so.2,原先编译的旧执行文件仍然继续使用libxxx.so?在不需要重新编译原有执行文件的前提下。

|
1、是要重新编译。同名so没有用,重要的是使用的那个,其它的是摆设。soname选项不是解决你的问题的。
2、升级gcc与更新libc是完全不同的两个问题。更新libc,如果其接口修改了,应用也一样要重新编译。
3、用-2的方式与换个库名称没有区别,不如用新名字,避免混淆。

|
这就是ldconfig的作用了,他会生成ld.so.conf对应的路径下的最新版本的库的符号连接到/usr/lib下,供你使用,这个符号连接的名字就是编译时soname所给的名字。可执行文件在连接so时要查看ld.so.cache动态依赖来决定连接的库文件。

你需要做的是
编译时使用-soname为动态库内部添加soname,如-soname libxxx.so.2 -o libxxx.so
添加你的库路径到/etc/ld.so.conf里,然后ldconfig.这样做会在/usr/lib下生成名为libxxx.so.2的符号连接,并且更新动态库依赖缓存。
然后编译客户程序时使用 -lxxx.so.2

|
编译时加 -soname  这就是调用时使用的库名。

|
可以用LD_LIBRARY_PATH设置路径的查找顺序来控制。
接口改了必须重新编译连接。

|
这是大版本号,我是跟着你的文件命名法。

linux里标准作法是,
/usr/lib/libxxx.so.3 ---> /usr/lib/libxxx.so.3.1.2
同时还可能存在 /usr/lib/libxxx.so.3.1.3
同时还可能存在 /usr/lib/libxxx.so.3.1.4
同时还可能存在 /usr/lib/libxxx.so.3.1.5
同时还可能存在 /usr/lib/libxxx.so.3.2.1
同时还可能存在 /usr/lib/libxxx.so.3.3.2
这样就可以方便的控制版本,
就像你这一个文件其实怎么做名字都无所谓。除非你想让多个版本都存在。

在写客户程序时永远只需要写dlopen("libxxx.so.3")不需要修改了;其它事情让ldconfig去做,它每次启动都会执行。

如果你使用动态库的静态连接方式那么,改了那就必须重编客户。加了接口则不必

|
如果你仅仅在原有.so的基础上增加了新的接口,而没有修改原有接口的话,直接覆盖应该没有问题。我没有试验过,但我觉得应该没问题。

另外一种解决办法是:采用类似com的接口技术以及QueryInterface技术,整个.so仅仅暴露一个接口“QueryInterface”,通过QueryInterface获得一组/几组接口。当然,这并不适用于当前的项目,权作后继开发的一个建议吧

|
当接口发生变化(特别是新增加了接口)的情况下,建议将so文件升版并重新编译可执行文件。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 创建IE各版本专属CSS IE中的if语句
  • C++ Bitsets 成员 Constructors:创建新bitsets
  • 菜鸟在c盘装了win2000,想在剩下的空间装Red Hat Enterprise Linux 3,在创建linux分区的时候,不知道都创建什么分区??我知道要创建一个
  • C++ Double Ended Queues(双向队列) 成员 Constructors:创建一个新双向队列
  • 一进程源源不断地创建文件,另一进程把这些创建的文件抓取并挪走
  • C++ I/O 成员 open():创建一个输入流
  • 创建用户组创建用户出错
  • Xcode介绍及创建工程和工程依赖操作步骤
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • HTML5 sprite 样式创建工具Stitches介绍
  • linux如何创建一个共享内存 可以mount 可以创建目录之类 跟硬盘分区一样
  • java Servlet实现Session创建存取以及url重写代码示例
  • php循环创建目录示例分享(php创建多级目录)
  • navicat 8 创建数据库与创建用户分配权限图文方法
  • sql server 2008:您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
  • mkdir()是创建文件夹的函数,有没有循环创建多个目录级的函数呢?
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • FTP上创建的文件夹的创建日期始终和本机的对不上(无论如何改变日期和时间)(紧急!!!)
  • 急!linux下mysql的创建用户组和创建用户命令不能生效啊????
  • 怎么创建包,我创建包后,怎么找不到呢?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 100求解:如何在UNIX环境下创建一个新的端口号?另:能告之如何在WINDOWS2000环境下创建一个新的端口号就更好了!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3