Я не могу быть единственным, кто столкнулся с этим.
У меня есть приложение на С++, которое необходимо связать с одной сторонней и другой статической библиотекой, установленной в SDK. SDK по какой-то ужасно расстраивающей причине перекомпилировал подмножество этой же сторонней библиотеки в свою собственную (переименованную) библиотеку lib, хотя сами символы называются одинаковыми, и они не инкапсулированы в пространство имен. Мое приложение зависит от той же сторонней библиотеки.
Я рассмотрел несколько вариантов, но, возможно, мне что-то не хватает, и, надеюсь, свежий взгляд поможет мне. Возможно, я рядом, и кто-то узнает следующий шаг для одного из них. Я буду перечислять то, что я пробовал, и недостатки каждого решения:
-
Связь с обоими. Я получаю около 2500 строк предупреждений о переопределении символов/изменении размера и ошибок. Это когда я впервые обнаружил, что они определили одни и те же символы. Я пытаюсь перекомпилировать OpenSSL с g++ и переместить его в пространство имен на данный момент... см. Ниже...
-
Ссылка только на SDK. Я получаю символы undefined, от которых зависит мой собственный код - это когда я обнаружил, что их перекомпиляция третьей стороны lib является подмножеством или, по крайней мере, была настроена с отключенным одним модулем.
-
Связывается только с третьей стороной lib. У меня есть пара символов undefined, о которых сообщает SDK, - один из них на самом деле является #define в файле заголовка в третьей стороне lib, поэтому все ссылки в третьей стороне lib разрешают определение, но ссылки вне этого не. Я переместил это в файл c, который разрешает это, однако у меня все еще есть две нерешенные функции, которые я не могу найти нигде. Это самое близкое, что я получил до сих пор.
-
Разделите конфликтующие символы из одной библиотеки и ссылки в обоих. Пока это не сработало. Это может быть проблема с версией между lib, статически связанной в SDK, и версиями, которые я пытался использовать сторонней lib, но похоже, что некоторые функции перемещались между символами, поэтому, удалив символ, я случайно удаляю функции, которые мне нужны в другом месте. Кажется, что нет идеального отображения между функциями в символах в SDK и функциями в символах в сторонней библиотеке. Возможно ли разрезать функции без необходимости ручной настройки адресов?
Я изучал символы в библиотеках с помощью:
nm -C --defined-only lib<name>.a
И извлечение целых объектов с помощью
ar -x lib<name>.a <objname>.o
Надеюсь, это также поможет другим, кто должен был связываться с сторонними библиотеками, которые конфликтуют друг с другом. Для специфики, сторонняя библиотека OpenSSL, а SDK Opsec - libcpopenssl.a является нарушителем lib в Opsec.
** РЕДАКТИРОВАТЬ. Возможно, поздняя запись может перекомпилировать OpenSSL с g++ и поместить все это в пространство имен, а затем связать обе библиотеки. Я сейчас пытаюсь... еще впереди...