Я работаю над расширением Вена , чтобы добавить возможность для третьих сторон писать плагины 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-битном режиме. И Vienna, и SynkPlugin компилируются с «стандартными 32/64 универсальными» настройками, а SynkPlugin имеет дополнительный флаг компоновщика «-undefined dynamic_lookup», который, насколько я понимаю, позволяет ему ссылаться на классы, найденные в Vienna.app без скомпилировать код для этих классов в собственный двоичный файл.
Другие ссылки на эту ошибку в переполнении стека связаны с различиями UIKit между iPhone / iPod Touch и iPad - в этих случаях в платформах фактически отсутствуют классы на iPhone / iPod Touch. В моем случае я уверен, что в Vienna.app где-то есть класс Article, поскольку он построен из идентичного кода для 32-битной версии.
Кто-нибудь видел такую ошибку раньше? Есть предложения по поиску дополнительной информации? Спасибо.