如何在两个不同的共享库中调用具有相同符号的函数? 我有几个C++版本的同一个库。我需要把它们并排比较。这些库使用相同的名称空间、函数名并采用相同的参数

如何在两个不同的共享库中调用具有相同符号的函数? 我有几个C++版本的同一个库。我需要把它们并排比较。这些库使用相同的名称空间、函数名并采用相同的参数,c++,shared-libraries,qnx,C++,Shared Libraries,Qnx,当我同时链接两个或多个库时,是否有任何方法可以控制我使用的库的哪个版本?您无法链接具有相同符号的两个库并同时访问这两个库。但是,您可以构建自己的精简包装库来消除两个版本库之间的歧义: 定义一个抽象类Wrapper,该类使用抽象虚拟函数执行目标库的函数 在名为wrapperpimpl的类中定义Wrapper的实现,该类从虚拟方法调用目标库 定义一个独立的方法Wrapper*MakeImpl返回newwrapperpimpl() 多次将WrapperImpl编译到静态库中,每次都链接到目标库的不同

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

您无法链接具有相同符号的两个库并同时访问这两个库。但是,您可以构建自己的精简包装库来消除两个版本库之间的歧义:

  • 定义一个抽象类
    Wrapper
    ,该类使用抽象虚拟函数执行目标库的函数
  • 在名为
    wrapperpimpl
    的类中定义
    Wrapper
    的实现,该类从虚拟方法调用目标库
  • 定义一个独立的方法
    Wrapper*MakeImpl
    返回
    newwrapperpimpl()
  • 多次将
    WrapperImpl
    编译到静态库中,每次都链接到目标库的不同版本临界:
    -dwrapperprimpl=wrapperimpv1-DMakeImpl=makeimpv1
    传递给编译器,对于不同版本,使用
    V1
    V2
    V3
    等。您应该得到多个库
  • 将主测试仪与这些多个库链接

此时,您的主测试仪可以访问通过预处理器重命名
MakeImpl
创建的独立功能
makeimpv1
makeimpv2
makeimpv3
,等等。使用这些函数可以获取调用不同版本的目标库的
包装器的实例。

AFAIK,您会收到一个链接器错误,抱怨定义了多个符号。不可以?你不能用相同的符号链接两个LIB,链接器只会拒绝这么做。Glibc有符号版本控制(比如看一看),如果你能重建你的库来包含这样的元数据,这种方法可能会帮助你
dlopen()
,但要做好维护噩梦的准备。对不起,伙计们,我忘了说我在QNX平台上工作,在那里我可以链接到两个这样的库。该程序可以编译并实际运行。它只调用其中一个库。我很想把这个包装器库的接口变成一个函数
Wrapper*GetWrapper()
。实际上,
Wrapper*GetWrapperV1()
等等。那么定义替换只需要在库中的单个标记上发生——GetWrapper函数的名称。一个纯的虚拟包装接口不需要有符号导出,以便客户机在(一些)(大多数)(所有)C++连接架构下使用(纯虚拟类的布局是足够的),而WrPrPiPiPL是一个不需要导出的私有实现细节。未使用
WrapperImplV1
名称-所有访问都通过
MakeImplV
函数完成,该函数是其版本特定库的唯一入口点。