我知道以前有人问过这个问题,但是在你给我一个减号并报告重复的问题之前,请思考一下:
在所有先前的答案中,每个人都说对象内存布局取决于编译器。那么,共享库(*.dll、*.so)如何能够导出和导入 c++ 类,并且即使来自不同的编译器也绝对可以组合起来?考虑在 mingw 下编写的 DirectX 应用程序。DirectX 是使用 MSVC++ 编译的,那么这些环境如何在内存布局上达成一致?我知道 DirectX 严重依赖 C++ 类和多态性。
换个方式问:假设我有一个选择的架构(例如 Windows、intel x86)并且我正在尝试编写一个新的编译器。我如何知道如何访问由另一个编译器编译的 .dll lib 提供的类实例(vtable、成员字段)?还是只是这样:M$ 编写了 VC++,从那时起它就成为了不成文的标准,而所有其他编译器都“出于兼容性原因”这样做?那么 linux 或其他操作系统呢?
编辑:
好吧,我承认,DirectX 的例子很糟糕,因为 COM 规范......
另一个例子:QT。我将 QT 与 mingw 一起使用,但我知道也有可用的 MSVC 版本。我不知道差异是否仅在标头中,或者共享库(dll-s)是否也不同。如果是,这是否意味着我必须分发包含 qt 库的应用程序,所以如果有人碰巧有不同编译器的库,它不会混淆?(很好的内存和代码共享,对吧?)。或者它们是否相同,并且无论如何都有一些不成文的法律?
编辑2:
我安装了一个不同的 qt 版本(msvc 2010)只是为了看看什么是共享的和不共享的。似乎共享(他们真的共享)库是不同的。似乎我真的必须为我的应用程序提供 qt-libs ......这不是一件小事(例如 QtGui 8-9MB)。那么其他较小的库呢,其作者不太愿意为其他编译器提供版本?这是否意味着我被他们原来的编译器困住了?如果我想使用由不同编译器编译的两个不同库怎么办?