Как вы вызываете функцию с одним и тем же символом в 2 разных общих библиотеках?
У меня есть несколько версий одной и той же библиотеки, написанной на C++. Мне нужно сравнить их бок о бок. Эти библиотеки используют одинаковое пространство имен, имена функций и принимают одинаковые параметры.
Существуют ли какие-либо методы для контроля того, какую версию библиотеки я использую, когда связываю два или более из них одновременно?
1 ответ
Вы не можете связать две библиотеки с одинаковыми символами и получить доступ к обеим. Однако вы можете создать свои собственные библиотеки тонких оболочек для устранения неоднозначности двух версионных библиотек:
- Определите абстрактный класс
Wrapper
реализует функции целевой библиотеки с использованием абстрактных виртуальных функций - Определить реализацию
Wrapper
в классе под названиемWrapperImpl
который обращается к целевой библиотеке из виртуальных методов - Определить автономный метод
Wrapper *MakeImpl
возвратеnew WrapperImpl()
- компилировать
WrapperImpl
в статические библиотеки несколько раз, каждый раз связываясь с разными версиями целевой библиотеки. Критическое: пройти-DWrapperImpl=WrapperImplV1 -DMakeImpl=MakeImplV1
компилятору, сV1
,V2
,V3
и так далее, для разных версий. Вы должны в конечном итоге с несколькими библиотеками. - Свяжите своего главного тестера с этими несколькими библиотеками
На этом этапе ваш главный тестер имеет доступ к автономным функциям. MakeImplV1
, MakeImplV2
, MakeImplV3
и так далее, созданный путем переименования MakeImpl
через препроцессор. Используйте эти функции для получения экземпляров Wrapper
которые обращаются к различным версиям целевой библиотеки.