Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么应用程序二进制接口对编程很重要_C++_C_Operating System_Binary Compatibility_Abi - Fatal编程技术网

C++ 为什么应用程序二进制接口对编程很重要

C++ 为什么应用程序二进制接口对编程很重要,c++,c,operating-system,binary-compatibility,abi,C++,C,Operating System,Binary Compatibility,Abi,我不明白为什么ABI是开发用户空间应用程序的重要环境。操作系统的系统调用集是否被视为ABI?但是如果是这样的话,那么不是所有关于系统调用的复杂性都封装在标准库中了吗 因此,ABI兼容性是否仅与在不同平台上运行静态链接的应用程序相关,因为系统调用将嵌入到二进制文件中?系统调用也遵循ABI-系统调用接口因操作系统而异 将应用程序和标准库静态链接到其中将把它绑定到一个系统调用ABI中。例如,FreeBSD只允许通过仿真模块使用Linux系统调用ABI 定义一组系统通用的对齐、调用约定和数据类型。这使得

我不明白为什么ABI是开发用户空间应用程序的重要环境。操作系统的系统调用集是否被视为ABI?但是如果是这样的话,那么不是所有关于系统调用的复杂性都封装在标准库中了吗


因此,ABI兼容性是否仅与在不同平台上运行静态链接的应用程序相关,因为系统调用将嵌入到二进制文件中?

系统调用也遵循ABI-系统调用接口因操作系统而异

将应用程序和标准库静态链接到其中将把它绑定到一个系统调用ABI中。例如,FreeBSD只允许通过仿真模块使用Linux系统调用ABI

定义一组系统通用的对齐、调用约定和数据类型。这使得ABI非常重要,如果你正在做任何类型的动态链接;没有it,一个应用程序的代码无法调用另一个应用程序提供的代码

所以,没有。ABI兼容性与所有动态链接相关(对于静态链接则较少)


再次强调系统的ABI影响应用程序间的工作以及应用程序到操作系统的工作,这是值得的。

ABI比可用的系统调用更重要。它还通常描述参数传递给函数的实际方式以及结构和对象在内存中的布局。如果没有一致的ABI,不同编译器生成的代码可能无法相互调用——如果调用foo(a,b),一个编译器将a和b推到堆栈上,而另一个编译器将a和b推到寄存器中,则会出现ABI冲突。

不兼容的ABI就是为什么即使OSX、Linux、Solaris、Windows和*BSD都在Intel x86 CPU上运行,在一个操作系统上编译的简单POSIX only hello world程序,如果不使用任何特定于供应商的或专有的系统调用和/或库,则在为另一个操作系统编译时,通常无法在一个操作系统上运行*

ABI对程序员来说并不重要,因为我们已经本能地知道你不能在Mac上运行Windows应用程序。即使是非程序员(好莱坞编剧除外)也知道这一点。当编译器编写人员需要针对特定环境时,这一点非常重要


*注意:有些操作系统(如Linux和BSD)支持外部ABI,因此有时可以在BSD上执行简单的Linux命令行程序,而无需修改。当然也有类似于Simulink的仿真层。

< P>不要忘记在C++中实现名字的方式是ABI

< P>的一部分。只有当你希望你的二进制文件在其他环境中运行而不需要重新编译时,你可能需要一些地方考虑ABI:

  • 您可以在程序中调用第三个库,第三个库可能因环境而异。(因此只有你可以信任的ABI)

  • 对操作系统的系统调用。(如果将系统调用静态链接到二进制文件,而不是动态链接到libc)

  • 实际上,大多数开发人员不需要考虑ABI,只有二进制加载器/工具开发人员需要更多地了解它。

    “ABI”(请参阅)是操作系统对数据格式所做的所有假设的总称。这包括可执行文件的布局以及给定其C定义的内存中任何数据结构的布局

    该术语通常还包括用同一种语言编写的程序之间的格式要求。每种语言都有特定的功能,可能会在可执行格式和内存结构中产生不同的约定,但最终都必须生成与操作系统兼容的可执行文件和与处理器指令集兼容的数据结构


    如果您只关心编译符合标准的代码,那么ABI并不重要。如果你违反了标准,做了一些不可移植的事情,比如把
    char*
    转换成
    long*
    ,这就有点关系了。在编写大量汇编代码时,这一点更为重要。编写链接器或调试器之类的东西,可以体现出要完成的大部分工作。

    哪些著名的ABI值得了解?或者什么是ABI的具体示例?唯一广为人知的ABI是为每个平台严格定义的“C”。每个C++编译器都实现了它自己的ABI,因此来自不同编译器的目标代码通常不兼容。C'往往是Web上所有不同语言之间的绑定代码。