保证 C++ 库、C 链接的二进制兼容性的简单方法?

Easy way to guarantee binary compatibility for C++ library, C linkage?

我不知道如何保证 C++ 库在 Windows 和 Linux 上的二进制兼容性。 但我想如果我用 C 链接使所有暴露的 APIs 我想我可以很容易地保证 Windows 和 Linux 上的这种兼容性。

是这样的:

extern "C" int SomeAPI();

其余函数肯定会用C++编写。只有暴露于外界的 API 才会有 C 链接。

并且公开的 API 必须是纯 C 函数 - 没有例外,不使用 C++ 类型。

我是对还是错? 我有什么误解吗?

我想即使是 C 程序我也可以使用这个库。

我想实现的兼容性是编译器向前兼容和标准库向前兼容。

而且我不能让它开源。我只需要关闭它。 --> 我会尝试让它开源。

我使用 boost 和 STL 制作共享或静态 C++ 库。 此外,我想知道兼容性不仅适用于编译,还适用于启动和 运行 以及 OS.

我说得对吗?

对于二进制兼容性,同样重要的是 application binary interface (ABI)。

顺便说一句,C++函数不仅可以return一些结果,还可以抛出一些异常。您需要记录这一点(即使您决定不抛出任何异常,这实际上很难实现,例如因为 new can throw std::bad_alloc 并且这可能发生在软件的某些内部层中)。

请注意(特别是在 Linux 上)C++ 标准库的 ABI 确实随着不同版本的编译器而改变。例如,std::string-s 或标准 C++ containers 的实现确实有所不同(以一种微妙的不兼容方式,在二进制级别)。您可以静态 link C++ 标准库(但这可能并不总是足够的,或者是脆弱的,例如,如果用户程序也需要它,因为他的代码在 C++ 中)。

由于大多数 C++ 编译器和标准库都是 free software on Linux,您可以深入了解它们的源代码以了解所有细节。这应该需要您 年的努力 并且您需要对此进行预算。

所以这比你相信的要难。至少,文档用于构建你的东西​​的 C++ 编译器的版本,以及涉及的 C++ 标准库的版本。

另一种方法(我推荐)可能是让你的东西 free software 开源 并在 [=76 上发布源代码=] 或其他地方,并让您的用户编译您的源代码(使用 his C++ 编译器和 C++ 标准库)。

与各种 C++ 编译器和标准 C++ 库的二进制兼容性实际上很难实现,因为细节决定成败(如果你只释放一些二进制的东西)。您可能会发布 几个 二进制文件,这些二进制文件使用 各种 编译器版本(例如 g++-5g++-6clang++-4.0 ETC...)。

I don't know exact way to guarantee binary compatibility for C++ library

这样的总体目标不切实际并且过于雄心勃勃。最多你可能会发布几个二进制文件和文档,其中包含每个已编译的确切 C++ 编译器(以及版本和编译器选项)和 C++ 标准库。

The compatibility I'd like to achieve is compiler forward compatibility and standard library forward compatibility.

这在一般情况下不可能。过去,各种 C++ 编译器确实破坏了 ABI 兼容性(这已被记录在案)。罪恶在于细节(因此,即使它在大多数时间看起来似乎都有效,但它通常可能存在错误)。

Am I right?

不,你错了,野心太大了。最多你可以发布一个二进制文件(可能你应该发布 几个 个)并准确说明它是如何构建的(什么 C++ 编译器和版本,什么编译标志,什么 C++ 标准库和版本以及甚至是什么 C 标准库和版本;如果你使用一些外部 C++ 或 C 库——比如 Qt、Boost、Sqlite 等——你还需要记录它们的版本)。 C++ 的二进制兼容性是虚构的。

您可以并且可能应该使用(特别是在 Linux 上)package management systems, e.g. publish some .deb 软件包用于某些特定的 Linux 发行版(例如给定版本的 Debian 或 Ubuntu)。您将在二进制包中列出确切的依赖项。

请注意,维护多个二进制版本(和二进制包)是一项您应该预算的枯燥工作。您可能会征求您的经理或客户的许可以打开您的库的源代码(通常这会减少工作量)。例如,您的库可能在 GPLv3 许可下发布:开源程序可以自由使用它,但专有应用程序必须从您的公司购买其他许可。