Как я могу изолировать символы библиотек C / C ++ / OBJC от C / C ++ / OBJC друг от друга?
-
01-10-2019 - |
Вопрос
У меня есть проект, который должен включать в себя две сторонние библиотеки, Liba и libb. У меня мало, если таковые имеются, влияют на сторонние библиотеки. Проблема заключается в том, что как Liba, и Libb включают разные версии общей библиотеки, ASIHTTPREQUEST. В результате я получаю ошибки, как:
-[ASIFormDataRequest setNumberOfTimesToRetryOnTimeout:]: unrecognized selector sent to instance 0x3b4170
, что я могу только предположить, потому что Liba ссылается на реализацию Libb ASIHTTPREQUEST (или на другую сторону).
Я пытался играть с strip -s <symbol file> -u <library>
Чтобы выделить символы библиотек друг от друга, но это приводит к либлюще XCODE, выпившими тысячи предупреждений и на самом деле не зафиксирует основную проблему, изложенную выше.
ld: warning: can't add line info to anonymous symbol anon-func-0x0 from ...
В целом, как можно / следует отделять библиотеки друг от друга?
Решение
Нет абсолютно никакого способа сделать это. Одно приложение Objective-C может иметь только одно значение для одного символа одновременно. Если вы загружаете две разные версии одной библиотеки, последний перезаписывает первый.
Две обходные пути:
- убедить разработчику использовать недавнюю версию
- Выполните обе библиотеки в отдельных процессах
Другие советы
Если они использовали одно и то же название символа линкера для разных процедур, единственным выходом (короткие взлома их объектных файлов), состоит в том, чтобы связать их в разные исполняемые файлы.
На платформах, которые поддерживают динамическое связывание (например,: DLL), вы можете построить один или как в отдельной DLL. Если они не являются частью экспортируемого интерфейса, символы не должны столкнуться.
В противном случае вы будете застрять вносить их в совершенно отдельные процессы и использовать IPC для передачи данных между ними.