客观稳定的ABI
Objective-C stable ABI
我主要是一个C++程序员。由于C++缺乏官方的ABI,我总是使用类似COM的方法来进行支持多个编译器的组件设计。
最近,我遇到了一个问题,Objective-C是否会取代类似COM的方法。显然,要想取代Objective-C,需要一个稳定的ABI,因此我想知道Objective-C是否存在稳定的ABI(在所有主要的操作系统[OSX、GNU/Linux、Windows]上),以及使用Objective-C(++)作为不同编译器创建的组件之间的"粘合剂"有多容易。
编辑:正如Nikolai Ruhe所指出的,对COM的简短描述可能会有所帮助。COM本质上是一种"二进制标准",允许混合不同编译器(以及各种语言)的二进制。COM的载体是定义方法(映射到C++的虚拟函数)的接口。组件至少实现一个接口,并作为DLL进行分发。它们可以位于系统上的任何位置(位置在注册表中指定),并且可以由任何COM客户端通过它们实现的接口的ID加载。
我只能代表苹果的实现,因为我没有使用GNU或其他端口的经验。
Objective-C在很大程度上依赖于C的ABI(比如函数调用和结构的内存布局)。
它自己的ABI在苹果的实现中经历了一些变化,比如"现代运行时"引入的非脆弱实例变量、属性的引入、更快的异常处理、垃圾收集、对ARC的__weak
支持
有些更改是向后兼容的,有些则不兼容。但由于整个系统和框架由苹果提供,并且这些更改通常与其他不兼容的更改(切换到英特尔和LP64)一起引入,这对用户没有任何影响。
编辑:您应该记住的一件事是,Objective-C不仅依赖于固定的ABI,还依赖于兼容的运行时。这又是一个让你头疼的问题。
- 海湾合作委员会手册中提到的"C++ ABI Specification"是什么?
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- AVX 指令中寄存器和指针之间的客观差异
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在AAPCS(ARM ABI)下,C/C++结构填充的稳定性如何
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- C++ ABI 兼容性问题/张量流
- 了解 ELF 可执行SHT_NOTE部分".note.ABI-tag"
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- 如何在红帽上强制使用 cxx11 ABI?
- std::regex and dual ABI
- MRB_THROW会导致libc++abi.dylib中的错误
- abi-compliance-checker 中的扩展选项用于什么?
- C++ Linux 上的插件 ABI 问题
- 如果我只使用指向基类的指针,更改私有派生类是否会影响 ABI?
- Centos6 gcc6:编译简单的 c++11 测试文件时,默认的 ABI 不拾取
- 使用共享库版本支持不同 ABI 的最佳实践是什么?
- 客观稳定的ABI