C++ 你能混合c++;使用同一编译器的不同版本编译
例如,我可以将在GCC-4.6中编译的一组库与GCC-4.9混合使用C++ 你能混合c++;使用同一编译器的不同版本编译,c++,gcc,abi,gcc4.9,gcc4.6,C++,Gcc,Abi,Gcc4.9,Gcc4.6,例如,我可以将在GCC-4.6中编译的一组库与GCC-4.9混合使用 我知道不同的编译器“品种”如VS不能与MinGW一起使用,但同一编译器的不同代可以吗?是否可能出现问题?如果是什么?您只能混合来自不同编译器或同一编译器的不同版本的生成的二进制文件(如果它们与ABI(应用程序二进制接口)兼容) 例如: 呼叫程序 名称损坏 线程本地存储处理 都是ABI的一部分 如果其中一种情况发生了变化,您会发现,您可能会遇到链接器错误、崩溃或其他形式的意外行为。 一般来说,编译器供应商通常会尝试至少保持与
我知道不同的编译器“品种”如VS不能与MinGW一起使用,但同一编译器的不同代可以吗?是否可能出现问题?如果是什么?您只能混合来自不同编译器或同一编译器的不同版本的生成的二进制文件(如果它们与ABI(应用程序二进制接口)兼容) 例如:
- 呼叫程序
- 名称损坏
- 线程本地存储处理
一般来说,编译器供应商通常会尝试至少保持与旧版本的向后兼容性,但这并不能保证。正如其他人所说,您必须阅读文档或重新编译所有内容。同一编译器的不同版本有时可以相互兼容,但并不总是兼容。例如,GCC 4.7.0,这意味着使用4.7.0+和4.7.0-编译的库可能彼此不兼容(因此在您的示例中,使用4.6编译的库将与使用4.9编译的库不兼容)。给定的编译器版本中也可能存在ABI错误:
- 以下内容将导致库次要版本号增加,例如从“libstdc++.so.3.0.4”增加到“libstdc++.so.3.0.5”
- 添加导出的全局或静态数据成员
- 添加导出函数、静态或非虚拟成员函数
- 通过其他实例化添加导出的一个或多个符号
- 其他允许的更改是可能的
- gcc/g++编译器ABI中的更改
- 更改导出符号的大小
- 更改导出符号的对齐方式
- 更改导出符号的布局
- 更改导出符号上的损坏
- 删除导出的符号
- 通过添加或删除基类更改类型的继承属性
- 将显式复制构造函数或析构函数添加到本来具有隐式版本的类中。这将改变编译器在按值返回语句或参数中处理此类的方式:编译器将被迫使用内存,而不是在寄存器中传递此类的实例。有关C++详细说明的函数调用约定和API的部分,请参阅进一步的细节。
请注意粗体部分。在一个完美的世界中,具有相同主要发行号的GCC版本将是二进制兼容的。这并不是一个完美的世界,所以在你开始像这样混合编译器版本之前要非常仔细地测试,但一般来说你可能会没事。你必须阅读编译器的文档。说“同一编译器的不同版本”比说“同一类型的不同编译器”更清楚吗,还是我遗漏了什么?你是在说ABI的概念吗?对于gcc,我建议您在这里查看一下:因此它查找gcc:下面的非详尽列表将导致库的主要版本号增加,例如从“libstdc++.So.3.0.4”增加到“libstdc++.So.4.0.0”。1.gcc/g++编译器中的更改最重要的是,标准库的内部可以更改,因此任何内联的内容都会严重损坏。在VC++中,甚至混合调试和发布CRT都不会因为这个原因而工作。@MatteoItalia我对VC++不太熟悉,并且假设标准库是平台的一部分,因此省略了它