我今天更新了一个脚本桥胶水文件(对于mail.app),注意到sdp(1) man page显示:
您不需要创建相应的实现文件;脚本桥将创建
运行时的类实现。
这听起来很酷,但是对于生成的类,我没有实现(如预期的那样):
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) man page):指定符号名没有定义是可以的。与
-两个级别的命名空间,生成的符号将标记为动态查找。
这意味着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似乎意味着我做的事情是正确的(“准备编写代码”部分),但没有提到这个问题。 最佳答案
由于类是动态创建的,因此无法链接到它。类将在运行时注册,但不会导出任何符号,链接器将无法找到它。
您需要将发送到MailApplication
和MailAttachment
的所有消息替换为发送到NSClassFromString(@"MailApplication")
和NSClassFromString(@"MailAttachment")
的消息。[MailApplication class]
变成NSClassFromString(@"MailApplication")
并且[MailAttachment class]
变成NSClassFromString(@"MailAttachment")
。