符号未找到:_OBJC_CLASS_$_Article。

4

我正在开发一个扩展程序,用于向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位模式。Vienna和SynkPlugin都使用“标准32/64通用”设置进行编译,而SynkPlugin还具有附加的链接器标志“-undefined dynamic_lookup”,据我所知,它允许其链接到在Vienna.app中找到的类,而无需将那些类的代码编译到自己的二进制文件中。

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

有人以前见过这样的错误吗?有任何关于查找更多信息的建议吗?谢谢。

1个回答

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

谢谢!不知道为什么这个在32位构建中(或者作为通用构建的32位应用程序运行时)可以工作,但是在64位上却不能? - dcrosta
1
是的,符号可见性和Objective-C:http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html#//apple_ref/doc/uid/TP40001670-98931 - 0xced
供参考的注意事项:目标还不能选择“部署”选项中的“剥离链接产品”选项。(在构建设置中) - dcrosta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接