如何在两个不同的共享库中调用具有相同符号的函数? 我有几个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
函数完成,该函数是其版本特定库的唯一入口点。