我正在探索在Erlang中编写应用程序的可能性,但它需要有一部分用Cocoa编写(可能是Objective-C).我希望前端和后端能够轻松进行通信.怎么能做到最好?
我可以考虑使用C端口和连接进程,但我认为我想要一个相反的情况(前端启动并连接到后端).有命名管道(FIFO),或者我可以通过TCP端口或命名的BSD套接字使用网络通信.有没有人有这方面的经验?
我今天正在更新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`
Run Code Online (Sandbox Code Playgroud)
我不想压制所有未定义的符号,因为这可能很容易掩盖合法的问题,所以我只是使用-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/...
Run Code Online (Sandbox Code Playgroud)
如果我使用-force_flat_namespace -undefined suppress(我不想使用,如上所述),也会发生这种情况.该脚本桥接编程指南似乎在暗示我做是正确的事情("准备代码"一节),但没有提到这个问题.