您如何在2个不同的共享库中调用具有相同符号的函数

How do you call a function with the same symbol in 2 different shared libraries?

本文关键字:调用 函数 符号 共享 2个      更新时间:2023-10-16

我有几个用C 编写的同一库的版本。我需要并排比较它们。这些库使用相同的命名空间,功能名称并采用相同的参数。

当我同时链接两个或多个时,是否有任何方法可以控制我使用的库的哪个版本?

您不能将两个库与相同的符号链接并访问两者。但是,您可以构建自己的薄包装库来消除两个版本的库:

  • 定义一个抽象类Wrapper,该类别使用抽象虚拟函数行使目标库的功能
  • 在称为WrapperImpl的类中定义了Wrapper的实现
  • 定义独立的方法Wrapper *MakeImpl返回new WrapperImpl()
  • WrapperImpl编译到静态库中多次,每次与目标库的不同版本链接。批评:-DWrapperImpl=WrapperImplV1 -DMakeImpl=MakeImplV1V1V2V3等相关编译器,以便用于不同版本。您应该最终得到多个库。
  • 将您的主要测试仪与这些多个库链接

此时,您的主要测试仪可以访问独立式功能MakeImplV1MakeImplV2MakeImplV3等,依次通过通过预处理程序重命名MakeImpl创建。使用这些功能获得Wrapper的实例,该实例呼叫到目标库的不同版本。