我正在扩展到Vienna,以增加第三方编写Objto-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还有一个附加的链接器标志“未定义的动态查找”,据我所知,它允许链接到Vienna.app中找到的类,而不必将这些类的代码编译成自己的二进制文件。
堆栈溢出错误的其他引用与iphone/ipod touch和ipad之间的uikit差异有关——在这些情况下,框架实际上缺少iphone/ipodtouch上的类。在我的例子中,我确信vienna.app中有article类,因为它是从相同的代码构建到32位版本的。
以前有人见过这样的错误吗?有什么建议可以在哪里查找更多信息吗?谢谢。

最佳答案

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

08-15 23:37