Я работаю над расширением до Vienna, чтобы добавить сторонние пользователи для создания плагинов Objective-C, но я получаю некоторые проблемы с компоновщиками во время выполнения только при работе в 64-битном режиме (все похоже, отлично работает в 32-битном режиме). Мой плагин, SynkPlugin, загружается следующий код в Vienna.app:
NSArray * bundlePaths = [NSBundle pathsForResourcesOfType:@"bundle" inDirectory:[[Preferences standardPreferences] pluginsFolder]];
NSEnumerator * enumerator = [bundlePaths objectEnumerator];
NSString * bundlePath;
NSMutableArray * plugins = [NSMutableArray array];
while ((bundlePath = [enumerator nextObject]) != nil)
{
NSBundle * pluginBundle = [NSBundle bundleWithPath:bundlePath];
Class principalClass = [pluginBundle principalClass];
id <ViennaPlugin, NSObject> plugin = [[principalClass alloc] init];
[plugins addObject:plugin];
[plugin release];
NSLog(@"Loaded plugin %@ [main class: %@]", bundlePath, principalClass);
}
И на выходе консоли, я получаю следующее сообщение об ошибке:
2010-07-09 08:55:40.128 Vienna[74065:a0f] Error loading /Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin: dlopen(/Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin, 265): Symbol not found: _OBJC_CLASS_$_Article
Referenced from: /Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin
Expected in: flat namespace
in /Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin
Эта ошибка происходит только при работе в 64-битный режим, а не 32-разрядный. И Вена, и SynkPlugin скомпилированы со стандартными 32/64 универсальными настройками, а SynkPlugin имеет дополнительный флаг компоновщика «-undefined dynamic_lookup», который, насколько я понимаю, позволяет ему ссылаться на классы, найденные в Vienna.app, без для компиляции кода для этих классов в свой собственный двоичный файл.
Другие ссылки на эту ошибку при переполнении стека связаны с различиями между UIKit между iPhone/iPod Touch и iPad - в этих случаях на фреймворках фактически отсутствуют классы на iPhone/iPod Touch. В моем случае я уверен, что у Vienna.app есть класс Article внутри него где-то, поскольку он построен из идентичного кода для 32-разрядной версии.
Кто-нибудь видел такую ошибку раньше? Есть ли предложения о том, где искать дополнительную информацию? Благодарю.
Сладкий, спасибо! Любая идея, почему это сработало в 32-битных сборках (или при запуске как 32-битное приложение в универсальной сборке), но не в 64-битном? – dcrosta
Да, Символьная видимость и цель-C: http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html#//apple_ref/doc/uid/TP40001670-98931 – 0xced
Примечание для справки: у цели также не должно быть выбрана опция «Связанный с разделителем» (в разделе «Развертывание в настройках сборки») – dcrosta