在一个项目中,模块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的 同一个符号名实现为乘法。
// 静态库1
gcc -o test1.o -c test1.c // test1.o
ar -v -q libtest1.a tst1.o // libtest1.a
// 静态库2
gcc -o test2.o -c test2.c // test2.o
ar -v -q libtest2.a tst2.o // libtest2.a
// 把不同版本的静态库都链接进去,只是链接顺序不同
gcc -o main1 main.c -L. -ltest1 -ltest2
gcc -o main2 main.c -L. -ltest2 -ltest2
// 观察输出结果
./main1
输出 sum=7
./main2
输出 sum=10
上述测试说明了问题:
不同版本的静态库中,同一个函数,如果符号名,参数都没有改变的情况下,内存中是只保留一份先加载的那份代码。
ps:其实打印一下函数地址会更直观,不过demo写完就不想改了,能说明问题就行了