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

问题描述:

我正在扩展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位版本的。

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

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

+0

甜,谢谢!任何想法为什么这个工作在32位版本(或作为通用版本中的32位应用程序运行)而不是64位? – dcrosta 2010-07-09 14:50:47

+1

是,符号可见性和Objective-C:http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html#//apple_ref/doc/uid/TP40001670-98931 – 0xced 2010-07-09 15:05:30

+0

供参考的注意事项:目标还必须没有选中“Strip Linked Product”选项(在构建设置中部署) – dcrosta 2010-07-09 21:38:17