我正在研究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位版本。
之前有没有人看过这样的错误?有什么建议在哪里寻找更多信息?感谢。
答案 0 :(得分:1)
在维也纳目标的构建设置中,在 GCC 4.2 - 代码生成下取消选中默认隐藏的符号(GCC_SYMBOLS_PRIVATE_EXTERN
)。