Как я могу изолировать символы сторонних библиотек C / C ++ / ObjC друг от друга? - PullRequest
2 голосов
/ 24 августа 2010

У меня есть проект, который должен включать две сторонние библиотеки, libA и libB. У меня мало, если таковые имеются, влияние на сторонние библиотеки. Проблема в том, что и libA, и libB содержат разные версии общей библиотеки ASIHTTPRequest. В результате я получаю сообщения об ошибках типа:

-[ASIFormDataRequest setNumberOfTimesToRetryOnTimeout:]: unrecognized selector sent to instance 0x3b4170

, что я могу предположить только потому, что libA ссылается на реализацию ASIHTTPRequest в libB (или наоборот).

Я пытался поиграться с strip -s <symbol file> -u <library>, чтобы изолировать символы библиотек друг от друга, но это приводит к тому, что компоновщик XCode выдает тысячи предупреждений и фактически не решает основную проблему, описанную выше.

ld: warning: can't add line info to anonymous symbol anon-func-0x0 from ...

В общем, как можно / нужно изолировать библиотеки друг от друга?

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Нет абсолютно никакого способа сделать это.Одно приложение Objective C может иметь только одно значение для одного символа за раз.Если вы загрузите две разные версии одной библиотеки, последняя заменит первую.

Два обходных пути:

  1. убедит разработчика использовать последнюю версию
  2. запустить обе библиотеки в отдельных процессах
0 голосов
/ 24 августа 2010

Если они использовали одно и то же имя символа компоновщика для разных подпрограмм, единственный выход (если не считать взлома их объектных файлов), это каким-то образом связать их в разные исполняемые файлы.

На платформах, которые поддерживают динамическое связывание (например, DLL), вы можете встроить одну или обе в отдельную DLL. Если они не являются частью экспортируемого интерфейса, символы не должны конфликтовать.

В противном случае вы бы застряли, помещая их в совершенно отдельные процессы и используя IPC для передачи данных между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...