我对API(应用程序编程接口)和ABI(应用程序二进制接口)感到困惑,有人可以解释一下这两者的概念是什么以及它们的区别吗?
API 在源代码级别定义模块向其客户端可用的对象和方法。如何实例化它的对象?您需要将哪些参数传递给其方法,它们返回什么?一般来说,当您想了解哪些库函数可用以及如何使用它们时,您就是在询问 API。
ABI 是一个较低级别的概念。它定义了模块与其客户端之间传递的位和字节。它们的格式是什么?它们是压入堆栈、传递到寄存器还是存储在其他地方?当函数返回时,堆栈是否需要清理?如果需要,谁负责清理?
完全愚蠢但有启发性的例子:
考虑一个将两个整数相乘的库函数:
long long multiply(unsigned int multiplicand, long multiplier);
Run Code Online (Sandbox Code Playgroud)
它的 API 指定您使用两个参数(一个无符号整数和一个有符号长整数)调用它,并且它返回一个有符号双精度长整数。
它的 ABI 可能指定您像这样使用它:
专业提示:如果我是你,我会找到另一个数学库。这个太可怕了!:-)