Символ не найден: _OBJC_CLASS _ $ _ Статья - PullRequest
4 голосов
/ 09 июля 2010

Я работаю над расширением Вена , чтобы добавить возможность для третьих сторон писать плагины 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-битной версии.

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

1 Ответ

1 голос
/ 09 июля 2010

В настройках сборки объекта Vienna, в разделе GCC 4.2 - Генерация кода снять отметку Символы, скрытые по умолчанию (GCC_SYMBOLS_PRIVATE_EXTERN).

...