C ++ 14/17项目是否可以使用使用C ++ 11标准编译的二进制库,或者源代码是否需要重新编译?

时间:2017-10-25 04:41:29

标签: c++ c++11 c++14 standards c++-standard-library

可以在c ++ 14/17项目中使用使用C ++ 11编译的二进制文件吗? 那个c ++ 17项目中的c ++ 14二进制库怎么样?

或者是否需要使用与项目相同的标准更新和重新编译源代码?

还有其他方法可以在新标准项目中包含旧的标准C ++库吗?

3 个答案:

答案 0 :(得分:3)

C ++标准与二进制文件的格式没有任何关系。这仅取决于编译器/链接器和操作系统。因此,如果编译器供应商更改了ABI(应用程序二进制接口),则不能简单地将这些部分链接在一起。

正如您在此处所述,仅与gcc相关:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

gcc用gcc5.1引入了一个新的ABI。可以在此处找到gcc库的版本历史以及ABI更改的注释:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

因此,从一个C ++版本转换到另一个版本并没有改变ABI,但改变编译器可以。

答案 1 :(得分:2)

我在你的问题中注意到了STL标签。如果在客户端界面中使用STL(我不会这样做),库中使用的实现可能与您当前使用的实现不同。

虚构的STL(或其他库)类的旧版本:

// old stl implementation
template < class T >
struct stl_t
{
  T data;
  void set_data( const T d ) { data = d; }
  T get_data() { return data; }
  //...
};

使用旧编译器/ STL开发的库:

// client interface file (source delivered to clients)
void f( stl_t<int>& ili ); // old stl assumed

// client interface implementation file (binary delivered to clients)
#include <stl_t> // old stl included!
//...
void f( stl_t<int>& ili ) // old stl used
{
  ili.set_data( 42 );
}

同一个虚构的STL类的新版本:

// new stl implementation
template < class T >
struct stl_t
{
  T* data { 0 }; // was T in previous implementation; now it is T*
  void set_data( const T d ) { *data = d; }
  T get_data() { return *data; }
  //...
};

混合STL版本的应用程序:

// your application
#include <stl_t> // new stl!
#include "library.h" // expects OLD stl but new used

void g()
{
  stl_t<int> a; // NEW stl
  f( a ); // OLD stl expected
  int i = a.get_data();
  // what value is i?
}

答案 2 :(得分:0)

标准定义哪些特性对于源代码中的编译器是可理解的,以及标准库提供的内容。您的问题的答案取决于您的库的ABI版本的兼容性,这些版本由您的编译器/工具链版本/实现定义。例如,由于std::string在他们构建的GCC 4.x和5.x库之间的ABI变化不会是可互连的。