4

今日、Scripting Bridge グルー ファイル (Mail.app 用) を更新していたところ、sdp(1) のマニュアル ページに次のように書かれていることに気付きました。

対応する実装ファイルを作成する必要はありません。Scripting Bridge は実行時にクラスの実装を作成します。

それはクールに聞こえますが、生成されたクラスの実装がなければ(予想どおり):

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_MailApplication", referenced from:
      objc-class-ref in DMBugReportWindowController.o
  "_OBJC_CLASS_$_MailAttachment", referenced from:
      objc-class-ref in DMBugReportWindowController.o
[... more of the same ...]
ld: symbol(s) not found for architecture x86_64`

正当な問題を簡単に覆い隠す可能性があるため、未定義のシンボルをすべて抑制したくないので、以下を使用しました ( ld(1) man ページ-Uに従って):

symbol_name が定義されていなくても問題ないことを指定しました。-two_levelnamespace を使用すると、結果のシンボルは dynamic_lookup とマークされます。これは、dyld がロードされたすべてのイメージを検索することを意味します。

(-Xlinker -U -Xlinker _OBJC_CLASS_$_MailApplicationこれらのフラグを使用して ld に到達する必要がありました。それ以外の場合、clang はそれらの引数を保持します。)

起動時にダイナミック リンク エラーが発生するため、これらを作成するのは明らかdynamic_lookupに間違っています。

dyld: Symbol not found: _OBJC_CLASS_$_MailApplication
  Referenced from: /Users/jonathon/Library/Developer/Xcode/...
  Expected in: flat namespace
 in /Users/jonathon/Library/Developer/Xcode/...

-force_flat_namespace -undefined suppressこれは、(上記のように、使用したくない)を使用した場合にも発生します。Scripting Bridge プログラミング ガイドは、私が正しく作業していることを暗示しているようですが (「コードの準備」セクション)、この問題については触れていません。

4

1 に答える 1

5

クラスは動的に作成されるため、リンクすることはできません。クラスは実行時に登録されますが、シンボルはエクスポートされず、リンカーはそれを見つけることができません。

およびに送信されたすべてのメッセージをMailApplicationおよびへのメッセージに置き換える必要があります。MailAttachmentNSClassFromString(@"MailApplication")NSClassFromString(@"MailAttachment")

[MailApplication class]となっNSClassFromString(@"MailApplication")ており[MailAttachment class]ますNSClassFromString(@"MailAttachment")

于 2012-07-09T10:04:04.023 に答える