I was updating a Scripting Bridge glue file today (for Mail.app), and noticed that the sdp(1) man page reads:
You do not need to create a corresponding implementation file; Scripting Bridge will create the class implementations at runtime.
That sounds cool, but without implementations for the generated classes I get (as expected):
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`
I don't want to suppress all undefined symbols, as that could easily mask legitimate issues, so I just used -U
(per the ld(1) man page):
Specified that it is ok for symbol_name to have no definition. With -two_levelnamespace, the resulting symbol will be marked dynamic_lookup which means dyld will search all loaded images.
(I had to use -Xlinker -U -Xlinker _OBJC_CLASS_$_MailApplication
for those flags to reach ld, otherwise clang keeps those arguments for itself.)
Evidently making them dynamic_lookup
is the wrong thing to do, because this gives a dynamic link error on launch:
dyld: Symbol not found: _OBJC_CLASS_$_MailApplication
Referenced from: /Users/jonathon/Library/Developer/Xcode/...
Expected in: flat namespace
in /Users/jonathon/Library/Developer/Xcode/...
This also happens if I use -force_flat_namespace -undefined suppress
(which I don't want to use, as above). The Scripting Bridge Programming Guide seems to imply I'm doing things correctly ("Preparing to Code" section), but doesn't mention this issue.