有两个软件团队为同一个OS(Scientific Linux 6.5)开发C++应用程序:
Team_A使用操作系统提供的编译器和库(GCC 4.4.7,GLIBC_2.12,GLIBCXX_3.4.13)来构建其C++ 98应用程序和各种共享库.
Team_B使用较新的GCC版本(4.8.3),该版本是从源代码构建的.它是一个本机编译器,它链接到OS libc,并使用OS标准头,但有自己的stdc ++版本(GLIBCXX_3.4.19).Team_B在C++ 11模式下使用此编译器来构建其应用程序(AppB),并将libstdc ++和libgcc_s与它一起部署.
Team_A以共享库(.so,.hpp)的形式向Team_B提供服务:LibA.该库的API是一组C++类(标头中的声明,.so中的实现),并且这些方法将std :: string和其他stdc ++类作为参数.
此时我们遇到了问题:AppB构造了GLIBCXX_3.4.19 C++ 11样式std ::无论什么对象并将它们传递给LibA,后者将它们解释为GLIBCXX_3.4.13 C++ 98样式对象,这可能不是向前兼容的.
这是一个问题吗?它会导致应用程序崩溃吗?std ::的任何实现是否兼容版本(相同的内存布局)?那么c ++ 98和C++ 11呢?
一些情节曲折使我更加困惑:
我想了解在这种情况下究竟发生了什么,如果它有风险,并且无效问题.让团队处于相同的开发环境不是一种选择.从API中删除std :: classes也很难.
欢迎任何指示!:)
与 C 不同,C++ 没有定义的 ABI。这意味着......
protected:
的决定private:
。public:
vtable 的位置和含义可以在编译器之间移动。不同编译器版本之间可能存在不同的预定义函数,例如 vtable 中的 typeinfo。您可以采取什么措施来缓解这些问题?
不提供编译的库,而是将服务作为源代码提供,以便在同一环境中编译。
源构建的编译器可以使用旧的 stdC++ 重新构建。这将限制第 3) 点的影响。
两个团队之间有一个接口,需要使用共同语言。这种语言可能应该是 C。
团队 A => C++ 门面/存根 => C 接口 => C++ 门面/代理 => 团队 B。
立面应建在其使用环境中。