这是因为 C + + 03支持在所使用的所有三个编译器版本中都是稳定的,所以 C + + 03组件在所有对象之间是兼容的。自从 GCC 5以来,C + + 11支持是稳定的,但是对象 D 不使用任何 C + + 11特性,而对象 E 和 F 都使用 C + + 11支持稳定的版本。C + + 17支持在任何已使用的编译器版本中都不稳定,但是只有对象 F 使用 C + + 17特性,因此与其他两个对象没有兼容性问题(它们共享的唯一特性来自 C + + 03或 C + + 11,所使用的版本使这些部分没有问题)。如果你后来想用 GCC 8和 -std=c++17编译第四个对象 G,那么你需要用相同的版本(或者不链接到 F)重新编译 F,因为 F 和 G 中的 C + + 17符号是不兼容的。
对于上述 D、 E 和 F 之间的兼容性,唯一的警告是您的程序必须使用 GCC7(或更高版本)中的 libstdc++.so共享库。因为对象 F 是用 GCC 7编译的,所以需要使用该版本中的共享库,因为用 GCC 7编译程序的任何部分都可能引入对 GCC 4.9或 GCC 5中的 libstdc++.so中不存在的符号的依赖关系。类似地,如果您链接到使用 GCC8构建的对象 G,则需要使用 GCC8中的 libstdc++.so来确保找到 G 所需的所有符号。简单的规则是确保程序在运行时使用的共享库至少与用于编译任何对象的版本一样新。