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`

我不想抑制所有未定义的符号,因为这很容易掩盖合法问题,所以我只是使用-U(根据ld(1) 手册页):

指定 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 Programming Guide似乎暗示我做事正确(“准备代码”部分),但没有提到这个问题。

4

1 回答 1

5

由于该类是动态创建的,因此您无法链接到它。该类将在运行时注册,但不会导出任何符号,并且链接器将无法找到它。

您需要将发送到MailApplication和的所有消息替换为和MailAttachment的消息。NSClassFromString(@"MailApplication")NSClassFromString(@"MailAttachment")

[MailApplication class]变成NSClassFromString(@"MailApplication")[MailAttachment class]变成NSClassFromString(@"MailAttachment")

于 2012-07-09T10:04:04.023 回答