サードパーティが Objective-C プラグインを作成できるようにするために、 Viennaの拡張に取り組んでいますが、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
このエラーは、32 ビット モードではなく、64 ビット モードで実行している場合にのみ発生します。Vienna と SynkPlugin はどちらも「標準の 32/64 ユニバーサル」設定でコンパイルされており、SynkPlugin には追加のリンカ フラグ「-undefined dynamic_lookup」があります。これらのクラスのコードを独自のバイナリにコンパイルします。
Stack Overflow でのこのエラーに関するその他の参照は、iPhone/iPod Touch と iPad の間の UIKit の違いに関係しています。これらの場合、実際にはフレームワークに iPhone/iPod Touch のクラスがありません。私の場合、Vienna.app は 32 ビット バージョンと同じコードから構築されているため、その中に Article クラスが含まれていることは確かです。
誰もこのようなエラーを見たことがありますか? 詳細情報をどこで探すべきかについて何か提案はありますか? ありがとう。