lin*_*ild 19 c++ gcc backwards-compatibility visual-c++ itanium-abi
我来自Linux世界,并且知道很多关于维护用C++语言编写的动态库API的向后二进制兼容性(BC)的文章.其中之一是基于Itanium C++ ABI的"使用C++的策略/二进制兼容性问题",它由GCC编译器使用.但我找不到类似的Microsoft C++编译器(来自MSVC).
我知道大多数技术都适用于MS C++编译器,我想发现与ABI差异相关的编译器特定问题(v表格布局,修改等)
所以,我的问题如下:
任何相关信息将受到高度赞赏.
非常感谢你的帮助!
Art*_*yom 22
首先,这些政策是一般的,不仅仅是指gcc.例如:函数中的私有/公共标记是MSVC特有的,而不是gcc.
所以基本上这些规则也完全适用于MSVC和通用编译器.
但...
你应该记住:
所以是的,你可以使用这些规则,但正如MSVC的通常情况一样,它有更多的怪癖.
另请参阅" 关于二进制兼容性的一些想法 ",并且Qt也使它们与MSVC保持ABI稳定.
注意我在CppCMS中遵循这些规则时有一些经验
在Windows上,您基本上有两个长期二进制兼容性选项:
看看我的帖子.在那里,您将看到一种在不同的编译器和编译器版本中以二进制兼容的方式创建DLL和访问DLL的方法.
MSVC二进制兼容性的最佳规则是使用C接口.根据我的经验,您可以使用的唯一C++功能是单继承接口.因此,将所有内容表示为使用C数据类型的接口.
这是一个非二进制兼容的东西列表:
new/ malloc在一个模块中和delete/ free在另一个模块中.有不同的堆彼此不了解.STL无法跨模块工作的另一个原因.简而言之,C++没有一致的ABI,但C确实如此,因此避免C++功能跨越模块.由于单继承是一个简单的v表,因此可以有效地使用它来公开C++对象,前提是它们使用C数据类型并且不进行跨堆分配.这也是Microsoft自己使用的方法,例如Direct3D API.GCC可用于提供稳定的ABI,但标准不要求这样,并且MSVC利用这种灵活性.