编译器在生成的代码中有很大的自由度。他们在实现VTable,RTTI,异常等等方面具有完全的自由。即使是非常基本的东西,例如指针的大小,函数的调用方式和名称修饰也可以任意选择,而与操作系统和体系结构无关。
但是,我从未遇到过在任何操作系统(Android,Linux,Mac OS,Windows),任何体系结构(x86,x86-)上使用任何编译器(Clang,GCC,ICC,MSVC)编译C ++程序的问题。 64,ARM)并将其链接到使用其他编译器构建的库。
所有二进制文件如何与其他文件兼容?
运行时链接程序或类似文件会动态地使二进制文件“适应”吗?
编译器是否同意某些标准?如果是这样,我在哪里可以找到有关这些二进制级别的事实标准的信息?
通常,它们是不兼容的。以下是一些不兼容的地方:
不同的数据类型大小
例如,GCC为a使用16个字节long double
,而VS将其别名为double
(8个字节)。有关更多信息,请检查此。
如果两种尺寸都已知,则可以轻松解决此问题,因为在尺寸之间进行转换是微不足道的(但可能会导致精度损失)。
改名
这可能是最知名的问题。C ++编译器需要修饰符号,以便(在很多情况下)函数重载是可能的。没有标准的名称处理方案,因此编译器会选择它们自己的名称,这会导致不兼容,因为例如使用VS编译的代码可能无法识别使用GCC甚至是VS早期版本编译的库中的名称。
可以通过不修饰名称并将其导出为未修饰的C函数来解决此问题。但是,这意味着必须将类方法包装在C函数中才能导出它们(因为C无法理解类),这实际上并不方便。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句