静态库递归引用产生的问题

由于静态库可以避免程序运行时去找动态库,所以编译的时候经常使用。

一、出问题的场景

a编译成静态库lib.a,b引用lib.a编译成静态库libb.a
这时项目c要使用b,但是直接引用libb.a和b的头文件并不能成功。
c需要同时引用a、b并且在Makefile中a必须写在b的后面。

二、具体描述说明

使用redis做二次开发。
首先将redis-3.2.6打包成静态库redis.a,
编写了一套C++的接口slibredis封装redis.a,把slibredis也打包成静态库slibredis.a,
用封装的slibredis.a写项目。

(1)本以为只需要引用自己封装的静态库即可,也就是slibredis.a和其对应的头文件;
    没想到会出错。各种"not found"

(2)没办法,只能引用redis-3.2.6的头文件;
    结果还是不行,各种"undefined reference to `_XXXXXXXX()`"

(3)没办法,只能把redis.a也引用进来。
    结果还是不行,各种"undefined reference to `_XXXXXXXX()`"

(4)后来查了资料,原来这种情况对Makefile也有要求,
    也就是在Makefile中,需要把最先引用的静态库写在后引用静态库的后面,
 也就是Makefile中需要这样写:g++ (省略n个字) /path/to/slibredis.a /path/to/redis.a
 终于成功了。

三、其他解决方案

    当然网上也说了各种添加参数,可以在封装slibredis的时候可以避免静态库递归的。不过最终还是没能成功。

原文地址:https://www.cnblogs.com/bugutian/p/6249596.html