makefile与动态链接库案例分析——动态库链接动态库
http://blog.csdn.net/huqinwei987/article/details/50517780
背景:效率考虑,要重用把服务器主备机方案,以库Libmdpha(高可用)的形式加进主工程dds(调度数据服务器)。
有源代码,打算直接编译Libmdpha.so.xxx,加入主工程dds。复制动态库libmdpha.so.xxx到主工程相关路径,并改makefile,makefile中主要加复制命令和建立软连接的命令,库名注意统一:
引用库中加入Libmdpha
同时加
cp -f $(INTERFACES_PATH)/libmdpha/$(VER_libmdpha)/lib/libmdpha.so.$(VER_libmdpha).$(VER_libmdpha_SUB) ../lib/
ln -sf ../lib/libmdpha.so.$(VER_libmdpha).$(VER_libmdpha_SUB) ../lib/libmdpha.so
将Libmdpha库放在dds主工程中,建立动态链接。
WARNING
凭回忆写,懒得复现了过于繁琐,比如刚加入主工程时编译的WARNING,好像是libmdpha中的so.2和so.3之类的,在主工程没有,所以WARNING找不到那些动态库别名。
然后就是在主工程中做那些相应的别名。
本着负责的原则,重现了下,路径不对的后果如下,需要同级的lib下,其实在主工程中库全在同级路径
会碰到两个工程的路径设置兼容问题
在Libmdpha的makefile指定了libmdpha.so依赖的库和路径../lib
但是在dds主工程中,却是同级关系,所以两个编译脚本和路径设置必须有个妥协,所以把Libmdpha的依赖库路径改了,源与目的在一起,看起来乱一点,这样倒是不用主工程dds以及dds依赖的更多的库了。
看似工作完成了。
但是。。。
但是,Libmdpha和dds7600工程依赖了相同的底层库(log库、工具库、初始化库等),版本却不一样(因为他们开发高可用库的时候用的是那个时候的库,现在dds用的新版本的库)。
有两种解决思路:
第一种方案:
库文件全复制进去,主工程dds和主备库Libmdpha各连接各的,xxx.so指向dds依赖的新版底层库,xxx.so.1指向libmdpha依赖的旧版底层库。互不干扰,缺点是两个版本的底层库都复制进去,臃肿,而且也混乱,长此以往,越来越乱,别人也会看不懂关联这么多怎么回事。
第二种方案:
把libmdpha换了依赖库(和dds统一),重新编译,好在有源代码。
隐患是可能会错,毕竟底层库版本不同了,但愿接口没区别。
用了第二种方案:把和主工程同版本的底层库放进去编译,然后再把libmdpha往主工程里放,然后用个和库libmdpha的makefile设置相同的别名*.so.3或者*.so.2,而主工程原来依赖的别名为*.so,因为已经统一了版本,其实是同一个文件。
最后,编译成功。
但是仔细看仍然有问题
#ldd
可以看到
libmdpha库依赖的这四个库其实链空了,虽然编译成功了,但是动态库缺失可能会导致程序运行失败。
解决方法是继续改libmdpha库的makefile,加上rpath:
左图是主工程的参考,右图是未加rpath的libmdpha库。
加后
LFLAGS = -w -shared -Wl,-soname,$(SO_NAME),-rpath=../lib
或
LFLAGS = -w -shared -Wl,-soname,$(SO_NAME),-rpath,../lib
在GNU环境下,有-Wl后,逗号和等号可以起到类似作用。
makefile与动态链接库案例分析——动态库链接动态库的更多相关文章
- 本地git库gitlab库链接服务器库 idea git 配置 gitlab 配置 git生成ssh公钥
下载git https://git-scm.com/ 安装以后会右键菜单出现Git Base Here 点击Git Base Here 输入 cd ~ 进入你的用户根目录 创建文件夹 mkdir ...
- 【2017下集美大学软工1412班_助教博客】个人作业2——APP案例分析
作业要求 个人作业2:APP案例分析 评分结果 按从高到低排列 学号后三位 第二次作业 Total 008 APP案例分析 23 044 第2次作业 19.5 011 App案例分析--XBMC 19 ...
- 静态库 VS 动态库
如何得到库 ①先写好一堆的.c文件(.c:我们所需要的各种工具函数) ②将这些.c编译为对应的.o ③将所有的这些.o打包为一个仓库文件(静态库或者动态库) 静态库:按照静态库的方式打包 动态库:按照 ...
- Makefile 编译动态库文件及链接动态库
本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...
- gcc链接g++编译生成的静态库和动态库的makefile示例
使用c++开发程序或者库时,将库提供给其他人使用. 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同. 首先是静态库,以链接g++编译生成的libmylib.a为 ...
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
转帖:http://blog.csdn.net/whygosofar/article/details/2821875 MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Lib ...
- 【转】分析Linux和windows动态库
原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...
- Linux 静态链接库和动态连接库
(0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...
- 03-Linux命令基础-第03天(makefile、静态库、动态库、gdb调试工具)
01- 复习 tar tvf xxx 查看压缩包内容 区分前后台: 是否能和用户交互 Vmware选桥接模式 会给系统虚拟一个和外部相同网段的ip 02- vim扩展操作 因为不是做嵌入式开发的 所以 ...
随机推荐
- 异常:Instantiation of bean failed; nested exception is java.lang.NoSuchMethodError: com.google.common.base.Preconditions.che ckState(ZLjava/lang/String;I)V
Instantiation of bean failed; nested exception is java.lang.NoSuchMethodError: com.google.common.bas ...
- nodeJs 使用 express-http-proxy 转发请求
开发过程中经常需要用到 nodeJs做转发层 使用express配合 express-http-proxy 可以轻松的完成转发 使用过程: 安装 express-http-proxy npm inst ...
- Django url
urlpatterns = [ url(正则表达式, views视图函数,参数,别名),] 参数说明: 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符 ...
- IE6-IE9中tbody的innerHTML不能赋值
对于IE6-IE9里如果要设置tbody的innerHTML,可以使用如下替代方法 Js代码 function setTBodyInnerHTML(tbody, html) { var div = d ...
- keil5一点project就闪退
进注册表“HKEY_CURRENT_USER——SOFTWARE——Keil——矿ision5——Recent Projects”里面,保留一个默认的(我是保留了,估计删掉也可以),其余 ...
- Interpreting the genomic landscape of speciation: a road map for finding barriers to gene flow
1.摘要 物种形成是种群间生殖隔离的进化过程,是连续的.复杂的,涉及多个相互作用的屏障.在完成之前,这一过程的影响会随着基因组的不同而变化,并可能导致具有分化和分化波峰和波谷的异质性基因组景观.当基因 ...
- IO分类
按流向分类: 输入流 读取数据 FileReader Reader 输出流 写入数据 FileWriter Writer 按数据类型分类: 字节流 字节输入流 读取数据 InputStream 字节输 ...
- Java框架spring 学习笔记(十九):事务管理(注解管理)
注解管理的方式要比xml配置方式要简单很多 只需在配置文件中添加事务注解 <?xml version="1.0" encoding="UTF-8"?> ...
- Docker容器的基本了解和命令
一.docker和虚拟机的对比 特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 更高效的利用系统资源 更快速 ...
- Windows下phpstudy配置tp5的nginx时遇到的奇葩问题
nginx原来的配置: hosts已经配置好127.0.0.1 到tpdev1.net这个域名 最后结果 No input file specified. 解决方法: 找到原因了,竟然是root的分隔 ...