针对 C++11 应用程序使用 C++17 库

Using a C++17 library against a C++11 application

如果所有 public 面向 C++17 库的头文件和 API 都被 C++ 11 应用程序使用遵循 C++11 语法。 C++17 库的内部实现确实具有 C++17 特定的功能。

静态链接还是动态链接重要吗?

未指定语言。

一般来说,一旦您更改了编译器版本或任何库的版本(公开或在两者之间传递),保证就会失效 window。您是否可以使用相同的编译器(相同版本)和相同的系统库重建双方?如果是这样,你很好。如果没有,请仔细检查编译器和系统库的文档(不要屏住呼吸)

C++ 不保证 ABI stability/compatibility。因此,您 总是 必须使用完全相同的编译器和 通常 具有相同的编译器选项。 一些 编译器有时 提供二进制兼容性保证,但不要指望它。虽然在对象之间更改语言标准版本 通常 很好,但在某些情况下,语言版本之间存在 ABI(或 API)中断。

C++ 语言 不提供任何保证,除非您使用相同的工具以相同的方式编译所有内容。基本上;每次都使用相同的工具和相同的设置或不保证从头开始编译所有内容(这包括您的代码、标准库的代码以及您可能使用的任何第三方库的代码正在使用)。

Is it possible to consume a library built using C++17 against a C++11 application if all the public facing headers and APIs belonging to the C++17 library that the C++11 application consumes follows C++11 syntax.

总的来说,这是灾难的根源。在某些情况下,如果幸运的话它可能会起作用(例如,如果您不共享更改 ABI 的标准库对象,如果您在使用 API 时没有触发任何 ABI 差异等) .

您要做的是使用完全相同的编译器编译所有您的代码,包括编译器版本和编译器标志。即使那样,您也应该阅读编译器的文档,了解有关 static/dynamic 链接依赖项和系统依赖项的更多可能问题。

The internal implementation of the C++17 library does have C++17 specific features.

这本身不是问题(事实上,许多 C++ 库提供 C 接口),但您需要尊重任何链接 restrictions/issues 您的 compiler/platform 文档。

Does it matter if it's a statically linked vs dynamically linked?

同上。对于大多数平台来说,混合C++11和C++17的问题应该不会有任何改变,但你仍然需要处理一些常见的问题。