Время выполнения Obj C столкновение символов в статической / динамической c библиотеке - PullRequest
0 голосов
/ 11 марта 2020

Я создаю динамическую c библиотеку, которая зависит от другой библиотеки c, которую я создал ранее. Библиотека stati c зависит от WebRT C. Однако новая библиотека Dynami c будет использоваться в приложении Swift, что также зависит от WebRT C. Это вызвало множество коллизий символов во время сборки, поэтому я последовал за этим до c и добавил файл экспорта символов в Dynami c lib.

Теперь Dynami c lib и приложение Swift оба работали нормально, однако я получил много консольных предупреждений относительно дублирующихся символов класса Obj C при запуске приложения Swift:

objc[63026]: Class RTCCVPixelBuffer is implemented in both /path/to/the/dynamic/framework/binary and /path/to/existing/webrtc/in/the/swift/app. One of the two will be used. Which one is undefined.

Я проверил свою динамику c framework и эти символы WebRT C Obj C являются локальными (не внешними) символами. Теперь у меня есть два вопроса:

  1. Будет ли локальное столкновение символов вызывать какие-либо проблемы во время выполнения, такие как неопределенное поведение приложения и приложение cra sh? Я понимаю, что дублированные глобальные символы не будут работать, но каков наихудший результат наличия дублированных локальных символов?
  2. Нужны ли эти локальные символы и как их удалить? Сначала я попытался предварительно связать объектные файлы в библиотеке stati c, установив GENERATE_MASTER_OBJECT_FILE, STRIP_STYLE и DEPLOYMENT_POSTPROCESSING в настройках сборки, в надежде разрешить все символы до того, как они попадут в библиотеку dynamici c, но все же я вижу эти локальные объекты Obj C символы класса в моей бинарной библиотеке c. Я также попытался установить опцию -R в Additional strip flags для удаления локальных символов, но это также не удалось. Требуются ли эти символы и не могут быть удалены, потому что от них зависит отправка сообщения Obj C? Как правильно решить проблему столкновения символов?

1 Ответ

0 голосов
/ 12 марта 2020

В итоге я добавляю префикс ко всем интерфейсам Obj C, используя атрибут objc_runtime_name . Это существенно меняет имя метаданных интерфейса на указанный строковый аргумент, что решает проблему дублирования символов.

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