覆盖静态库中定义的C函数

jas*_*r77 7 c gcc cygwin g++

我有一个C文件的静态库,在Cygwin上用g ++编译.我希望单元测试库中定义的一个函数.该函数调用该库中定义的另一个函数,我希望覆盖依赖项以将其替换为我自己的该函数版本.我无法修改静态库中的内容,因此此解决方案[ 覆盖C中的函数调用 ]不适用.

通常,我可以编写.cpp文件并包含.c文件,其中包含我想要单元测试的函数,它实际上使用我添加的代码扩展了该文件.这是一个我从未用于生产代码的肮脏技巧,但它对于单元测试C文件很方便,因为它使我的测试代码能够访问该C文件中的静态内容.然后,我可以写我的假依赖版本,以及调用我正在测试的函数的单元测试函数.我编译my.cpp来获取my.o,然后将其与静态库链接.从理论上讲,由于链接器已经找到了依赖关系的定义(我提供的那个),因此它不会在库中查找,也不会发生冲突.通常这可行,但现在我得到一个"多重定义"错误,链接器首先找到我的假,然后找到真正的假.我不知道是什么原因引起的,不知道该找什么.我也不能把它归结为一个简单的例子,因为我的简单例子没有这个问题.

想法好吗?

Jer*_*fin 5

一种可能性(诚​​然,丑陋,但......)是从静态库中提取单个目标文件.如果你调用该函数和函数调用位于独立的目标文件,你可以对链接包含你需要调用该函数的目标文件,但不反对包含它调用该函数的一个.

这只会给出完整对象文件级别的粒度,因此如果涉及的两个函数都在同一个目标文件中,它将无法工作.如果你真的需要让事情发挥作用,并且不介意对相关的目标文件进行非常小的修改,你可以使用二进制编辑器将第二个函数标记为弱外部,这意味着它'将在没有任何其他具有相同名称的外部设备的情况下使用,但如果提供了另一个外部设备,则将使用该外部设备.

后者是否有资格作为"修改库"取决于您的观点.它不是修改库中的代码,而是修改该代码周围的一些目标文件包装器.我的猜测是你宁愿不这样做,但它可能仍然是摆脱原本无法维持的最干净的方式.