背景
环境是这样的,一个复杂的C++项目,本来在A机器上能编译过去的,但放到B机器上编译可执行程序时链接的so出现未定义的引用。这就有点莫名奇妙了。
原因
我这边造成这个现象的原因有以下几点:
① 在makefile中所有的-I(头文件包含)和-L(动态库包含)命令,他们都喜欢放到一个xxx.sh文件中,通过传入不同的参数,可以输出对应的-I和-L。估计是方便其他程序复用,以及对应的makefile看起来简洁美观点。
② 其实就是 ① 的扩展,在makefile中通过-D参数,定义宏,这个就比较关键。了,比如-DMyDefine
在某.h代码中:
#ifndef MyDefine
#define MyFunction(A, B, C) \
printf(B, C)
#else
#include "xxxx.h"
#endif
问题就来了,在编译so时,makefile中可能定义了对应了宏,而在可执行程序时,没有定义。或者情况和这相反。再加上代码写得比较拉跨。xxxx.h中有大量某函数重载。所以解决的方法,就是编译时so和可执行程序都一致,不要一个定义了宏,一个没定义宏。
总结
一般开源的so兼容性相当好,基本上不会出现上面的问题,自定义的so很有可能会出现。所以解决办法,还得去看makefile文件,和报错的地方,多少个参数,并且是在哪个地方定义的.