У меня есть проект, который должен включать две сторонние библиотеки, 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 ...
В общем, как можно/нужно изолировать один библиотек друг от друга?
Проблема в том, что в Objective-C нет скрытых символов. Если обе библиотеки ссылаются на общую третью библиотеку Obj-C, эти символы всегда видны и, следовательно, конфликтуют. отдельные процессы - единственный способ избежать этих проблем. –
@Max Seelemann - Я не думаю, что это действительно важно. Обычно символы, спрятанные в динамически загружаемых библиотеках, таких как библиотеки DLL, не видны другим DLL или основной программе. Я использовал это в прошлом, чтобы библиотеки, которые использовали конфликтующие имена для внутренних подпрограмм и глобальных переменных (и предназначались для работы в разных процессах), чтобы играть друг с другом в одном и том же исполняемом файле. –
Это может быть справедливо. Но Objective-C имеет центральный реестр имен методов, время выполнения, независимо от того, откуда они происходят. Невозможно скрыть или экспортировать символ в objc. Все символы всегда общедоступны. –