首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在开发单个可执行文件时使用不同的C++编译器和语言版本

在开发单个可执行文件时使用不同的C++编译器和语言版本
EN

Software Engineering用户
提问于 2017-02-16 15:26:53
回答 6查看 8.3K关注 0票数 18

我们公司将为卫星通信购买一个庞大而非常复杂的源代码。

它是用C++编码的,我们也将在C++中对其进行代码添加,将我们的代码与购买的代码链接到一个可执行单元中。

  • 我们是否有必要使用相同的编译器和编译器版本来开发购买的代码?
  • 我们是否有必要使用与购买的代码相同的C++版本?如果它不使用2014年,我们__might__想要使用它的一些特性,但是如果混合不同版本可能会出现一些问题,则不会。

当然,从理论上讲,这并不重要,尤其是语言版本,但可以想象不同版本的编译器会生成不同的对象代码,可能会导致时间差异等等。

我们应该意识到什么?

EN

回答 6

Software Engineering用户

回答已采纳

发布于 2017-02-16 16:52:52

我们是否有必要使用相同的编译器和编译器版本来开发购买的代码?

那得看情况。

编译器生成针对ABI的代码。有些人正在使用普通的ABI (例如,如果我没有弄错,clang++和g++目标都被称为Itanium ABI),而且您应该--可能会有错误阻止您这么做--能够在同一个程序中使用来自这两个程序的对象代码(当然,假设您使用的是针对相同版本的ABI的版本)。编译器版本之间也是如此:有些人比其他版本更注意保持相同的ABI。显然,它们都需要在某个时候进行ABI更改,并且可能被迫以不兼容的方式这样做。显然,一些设置,如语言标准的选择,可能会对ABI的选择产生影响。

还有标准库的问题。编译器(或同一编译器的不同版本)本身可能使用相同的ABI,但是它们的标准库可能是不兼容的(一些像clang++这样的编译器可以在几个标准库中使用)。能否使它工作可能取决于在接口中使用的是什么。

换句话说,您必须挖掘并找到您所处的特定案例的信息。作为您应该查找哪种信息的起点和示例,这里是libstdc++提供的信息( g++使用的库,以及clang++在某些配置中使用的库)。

票数 9
EN

Software Engineering用户

发布于 2017-02-16 18:43:29

我们是否有必要使用相同的编译器和编译器版本来开发购买的代码?我们是否有必要使用与购买的代码相同的C++版本?

这主要不是一个技术性问题。这是一个关于你在合同中写什么的法律问题。确保软件供应商向您提供了由他保证的在您的环境中可用的版本。否则,在使用不同的编译器、编译器版本或语言版本时,总会有一定的风险。

当您将组件或其部分作为封闭源购买时,这一点尤为重要。即使您的供应商保证您可以在当前的编译器环境中使用该组件,他是否保证如果您希望在将来切换到较新的编译器版本,他也会向您提供更新吗?如果您无法访问完整的源代码,那么您很可能无法自己解决任何兼容性问题。这就是为什么你不应该仅仅购买软件,还应该考虑与你的供应商的长期维护合同。

票数 9
EN

Software Engineering用户

发布于 2017-02-16 20:56:17

我们公司将为卫星通信购买一个庞大而非常复杂的源代码。它是用C++编码的,我们也将在C++中对其进行代码添加,将我们的代码与购买的代码链接到一个可执行单元中。

听起来不错!

我们是否有必要使用相同的编译器和编译器版本来开发购买的代码?

一般说来,没有必要。C++的目的是作为对这类事物的抽象,因此一个编写良好的C++程序将在您的工具链上编译得和在原始作者的工具链上一样好,并且得到的程序也会有相同的结果。性能可能会有所不同,因为不同的编译器擅长不同的事情,但是程序的基本行为不应该改变。

然而,写得不好的软件可能依赖于特定于实现的行为,甚至是未定义的行为。它可能会对内置类型做出假设,或者对平台的功能做出假设。即使是编写得很好的软件也可能别无选择,只能依赖您所选择的工具链上无法使用的非标准扩展,或者它可能会这样做,因为根本不需要花费时间在原始项目的持续时间内添加可移植层。

最终,您需要询问作者/供应商编写源代码的目的是什么。如果他们声称它是专门针对Visual 2015编写的,并且需要Windows特性,那么您可能应该坚持这样做。但是如果他们声称它是可移植的,标准的C++,那么使用任何你喜欢的编译器。确保您的购买协议包括一个支持安排,以便您可以获得免费帮助时,它的供应商是谎言。

我们是否有必要使用与购买的代码相同的C++版本?如果它不使用2014年,我们可能想使用它的一些功能,但如果在混合不同版本时可能会出现一些问题。

可能吧。也许吧。

C++03在很大程度上是向前兼容的,因此,如果代码是C++03,那么您不太可能有问题。(尽管可能需要进行一些调整。)

但是C++11和C++14中引入的特性并不是向后兼容的,所以如果供应商使用C++11 lambdas,然后尝试在C++03编译器中构建它们的代码,那就无法工作了。

当然,从理论上讲,这并不重要,尤其是语言版本,但可以想象不同版本的编译器会生成不同的对象代码,可能会导致时间差异等等。

绝对一点儿没错。如果代码在很大程度上依赖于特定的实现来获得预期的结果,那么应该由供应商负责并通知您。因为我们生活在现实世界中,我建议你要勤奋,先问他们。

我要重复其他人所说的话:确保你有某种支持手段,这样如果他们歪曲了对这些问题的任何答复(不管是有意的还是其他的),你最终就不会承担由此产生的费用。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/342386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档