在一个工程中使用了不同版本的静态库的问题分析

来源:互联网 发布:天龙八部mac版下载 编辑:程序博客网 时间:2024/06/04 18:12

在一个项目中,模块A链接了poco的1.6.1版本静态库。

后来发现解析json抛异常。

但是独立的demo中却正常。

通过排查发现,项目中的其他模块集成了poco 1.5的版本静态库。

而通过poco的文档发现,json在1.5的版本中确实存在bug,而在1.6的版本中修复了此bug。


问题就是:明明是静态链接,为什么还会互相影响?

于是写了个demo简单模拟了一份代码里调用了不同版本静态库的同一个函数的情况。

test.h

extern int add(int, int);

test1.c

int add(int a, int b){    return a+b;}

test2.c

int add(int a, int b){    return a*b;}

main.c

#include <stdio.h>#include "test.h"int main(){    int sum = add(2,5);    printf("sum = %d\n", sum);        return 0;}


模拟2个不同版本的静态库。版本1里面实现加法,版本2的 同一个符号名实现为乘法。

// 静态库1gcc -o test1.o -c test1.c  // test1.oar -v -q libtest1.a tst1.o // libtest1.a// 静态库2gcc -o test2.o -c test2.c  // test2.oar -v -q libtest2.a tst2.o // libtest2.a// 把不同版本的静态库都链接进去,只是链接顺序不同gcc -o main1 main.c -L. -ltest1 -ltest2gcc -o main2 main.c -L. -ltest2 -ltest2// 观察输出结果./main1    -- 输出sum=7./main2    -- 输出sum=10

上述结果很好的说明了问题:

在不同版本的静态库中,同一个函数,如果符号名,参数都没有改变的情况下,内存中是只保留一份先加载的那份代码。

ps:其实打印一下函数地址会更直观,不过demo写完就不想改了,能说明问题就行了


0 0