2010-08-24 1 views
2

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

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

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

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

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

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

ответ

1

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

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

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

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

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

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

+0

Проблема в том, что в Objective-C нет скрытых символов. Если обе библиотеки ссылаются на общую третью библиотеку Obj-C, эти символы всегда видны и, следовательно, конфликтуют. отдельные процессы - единственный способ избежать этих проблем. –

+0

@Max Seelemann - Я не думаю, что это действительно важно. Обычно символы, спрятанные в динамически загружаемых библиотеках, таких как библиотеки DLL, не видны другим DLL или основной программе. Я использовал это в прошлом, чтобы библиотеки, которые использовали конфликтующие имена для внутренних подпрограмм и глобальных переменных (и предназначались для работы в разных процессах), чтобы играть друг с другом в одном и том же исполняемом файле. –

+0

Это может быть справедливо. Но Objective-C имеет центральный реестр имен методов, время выполнения, независимо от того, откуда они происходят. Невозможно скрыть или экспортировать символ в objc. Все символы всегда общедоступны. –

Смежные вопросы