未找到符号:_OBJC_CLASS _ $ _文章

时间:2010-07-09 13:16:51

标签: objective-c cocoa x86-64 dynamic-linking

我正在研究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中找到的类而没有将这些类的代码编译成自己的二进制文件。

Stack Overflow上对此错误的其他引用与iPhone / iPod Touch和iPad之间的UIKit差异有关 - 在这些情况下,框架实际上缺少iPhone / iPod Touch上的类。就我而言,我确信Vienna.app在其中的某个地方有Article类,因为它是从相同的代码构建到32位版本。

之前有没有人看过这样的错误?有什么建议在哪里寻找更多信息?感谢。

1 个答案:

答案 0 :(得分:1)

在维也纳目标的构建设置中,在 GCC 4.2 - 代码生成下取消选中默认隐藏的符号GCC_SYMBOLS_PRIVATE_EXTERN)。