Дубликат конфликтующие платформы в плагинах какао

Я в настоящее время пишу сменную платформу для своего приложения. Я хотел бы смочь выпустить плагины, не имея необходимость обновлять мое приложение, и я предназначаю при предоставлении доступа к платформе, для сторонних плагинов. Я в настоящее время сталкиваюсь с проблемами, когда два плагина поставлются с идентичными платформами. Когда плагины загружаются, время выполнения запутывается, потому что платформа загружается дважды. Что лучший способ состоит в том, чтобы смягчить эту проблему?

1
задан Carmen 4 May 2010 в 17:25
поделиться

1 ответ

Немного непонятно, о чем вы спрашиваете. Вы имеете в виду, что плагины оба включают ваш фреймворк, или другие сторонние фреймворки?

Если они оба включают ваш фреймворк, то вы не должны делать это таким образом; они должны ссылаться на фреймворк, встроенный в ваше приложение. Вы можете ссылаться на пакет фреймворков через @executable_path, чтобы он был относительно вашего приложения (например, @executable_path/.../Frameworks/MyFramework.framework/).

Вот пример из Lightroom:

% otool -L Applications/Adobe\ Lightroom\ 2.app/Contents/PlugIns/Web.lrmodule/Contents/MacOS/Web
Applications/Adobe Lightroom 2.app/Contents/PlugIns/Web.lrmodule/Contents/MacOS/Web:
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
    @executable_path/../Frameworks/AgSubstrate.framework/Versions/A/AgSubstrate (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)

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

2
ответ дан 3 September 2019 в 00:48
поделиться