2010-07-09 4 views
3

Я работаю над расширением до 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-разрядной версии.

Кто-нибудь видел такую ​​ошибку раньше? Есть ли предложения о том, где искать дополнительную информацию? Благодарю.

ответ

1

В настройках сборки мишени Вена, под GCC 4,2 - Генерация кода снимите флажок символы скрыты по умолчанию (GCC_SYMBOLS_PRIVATE_EXTERN).

+0

Сладкий, спасибо! Любая идея, почему это сработало в 32-битных сборках (или при запуске как 32-битное приложение в универсальной сборке), но не в 64-битном? – dcrosta

+1

Да, Символьная видимость и цель-C: http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html#//apple_ref/doc/uid/TP40001670-98931 – 0xced

+0

Примечание для справки: у цели также не должно быть выбрана опция «Связанный с разделителем» (в разделе «Развертывание в настройках сборки») – dcrosta

Смежные вопросы