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