単一の実行可能ファイルを開発するときに、異なるC ++コンパイラと言語バージョンを使用する


15

当社は、衛星通信用の大きくて非常に複雑なソースコードを購入します。

これはC ++でコーディングされており、C ++でもコードに追加をコーディングし、購入したコードとコードを単一の実行可能ユニットにリンクします。

  • 購入したコードの開発に使用したのと同じコンパイラーおよび同じコンパイラーのバージョンを使用する必要がありますか?

  • 購入したコードと同じバージョンのC ++を使用する必要がありますか?それは2014を使用していない場合、我々は_might_それのいくつかの機能を使用したいのですが、異なるバージョンを混合しながらいくつかの問題があるかもしれないではない場合。

理論上はもちろん、特に言語バージョンは重要ではありませんが、コンパイラのバージョンが異なると異なるオブジェクトコードが生成され、タイミングの違いなどが発生する可能性が考えられます。

何に注意する必要がありますか?


7
ソースコードを購入するだけでなく、(資格のある人による)いくつかのサポートを購入することを願っています。
バジルスタリンケビッチ

1
確かに、私たちはそうです。そして、もちろん、私もサプライヤーにこの質問をしました。しかし、私はそれがここでの良い議論のポイントであり、将来他の人にとって良い参考になると思った。
Mawgは、モニカを

2
サポートされていないコンパイラを使用してサードパーティのコードをコンパイルすることについて話しているのですか、または異なるコンパイラを使用してコードの異なる部分をコンパイルすることについて話しているのですか(たとえば、購入するコードにサポートされているものを使用し、独自のコードに新しいものを使用してからそれらをリンクする)?または、質問のそれらの部分の間で決定していますか?
jpmc26

3
言語バージョンが重要な場合もあります。(古い)コンパイラバージョンのリストとABIの小さな違いについては、gcc.gnu.org / wiki / Cxx11AbiCompatibilityを参照してください。言い換えれば、同じコンパイラですが、異なるC ++言語設定(c ++ 03 s c ++ 11)が重要な場合があります。
アンドレ

2
また、MSVCでは、一般に(動的な)ライブラリの境界を越えて標準ライブラリオブジェクトを渡すことは安全ではありません。例を参照してくださいstackoverflow.com/q/5661738/417197
アンドレ・

回答:


9

購入したコードの開発に使用したのと同じコンパイラーおよび同じコンパイラーのバージョンを使用する必要がありますか?

場合によります。

コンパイラーは、ABIをターゲットとするコードを生成します。いくつかは一般的なABIを使用しています(たとえば、私が間違えない場合、clang ++とg ++の両方がItanium ABIと呼ばれることをターゲットとします)、そうすることを妨げるバグがある可能性があります-オブジェクトコードを使用できる同じプログラム内の両方から(もちろん、同じバージョンのABIをターゲットとするバージョンを使用していると仮定して)。コンパイラーのバージョン間でも同じことが言えます。バージョン間で同じABIを維持するように注意する人もいます。明らかに、彼らはいつかABIの変更を必要とし、互換性のない方法でそれを余儀なくされるかもしれません。そして明らかに、言語標準の選択のようないくつかの設定は、ABIの選択に影響を与える可能性があります。

次に、標準ライブラリの問題があります。コンパイラー(または同じコンパイラーの異なるバージョン)自体は同じABIを使用する場合がありますが、それらの標準ライブラリーには互換性がない場合があります(clang ++などの一部のコンパイラーはいくつかの標準ライブラリーで使用できる場合があります)。動作させることができるかどうかは、インターフェイスで何が使用されているかによって異なります。

言い換えれば、あなたはあなたがしている特定のケースのための情報を掘ると見つける必要があります。開始点とどのような情報の例として、あなたが探さなければならない、ここにlibstdcによって提供される情報は、グラムで使用するライブラリ(++です++およびclang ++によるいくつかの構成で)


10
ABI =アプリケーションバイナリインターフェイス
サイモンB

2
この答えは、オブジェクトコードの互換性に関するものです。OPはソースコードを購入しています
ライトネスレース、モニカと

7
@LightnessRacesinOrbitこの質問は、さまざまなコンパイラを使用して単一の実行可能ファイルを生成することについて語っています。「これは、サードパーティのコードを1つのコンパイラ(おそらく「サポートされている」もの)でコンパイルし、独自のコードを別のコンパイラ(おそらく新しいもの)でコンパイルすることを意味します。」(これは間違いなく、OPが求めていることを理解しているものです。読み方が違う場合は、OPに明確にするように依頼することをお勧めします。)
jpmc26

1
@ jpmc26:「これは間違いなくOPが求めていることだと理解しています。読み方が異なる場合は、OPに明確にするように依頼することをお勧めします。」OPは、会社が「大きくて非常に複雑なソースコードを購入する」と明確に述べています。さらに、「コンパイラの異なるバージョンが異なるオブジェクトコードを生成する可能性があり、タイミングの違いを引き起こす可能性がある」などのステートメントでは、購入したコードを独自のツールチェーンだけでなく異なるツールチェーンでコンパイルするときにどのような変更が必要かを尋ねています。解釈の余地はあまりないと思います!
モニカとの軽さのレース

8

購入したコードの開発に使用したのと同じコンパイラーおよび同じコンパイラーのバージョンを使用する必要がありますか?購入したコードと同じバージョンのC ++を使用する必要がありますか?

これは主に技術的な質問ではありません。それはあなたがあなたの契約書に何を書くかについての法的質問です。ソフトウェアベンダーが、環境で使用できることが保証されているバージョンを提供していることを確認してください。そうしないと、異なるコンパイラ、コンパイラバージョン、または言語バージョンで問題が発生する可能性が常にあります。

これは、コンポーネントまたはその一部をクローズドソースとして購入する場合に特に重要です。サプライヤは、現在のコンパイラ環境でコンポーネントを使用できることを保証している場合でも、将来新しいコンパイラバージョンに切り替える場合は、更新を提供することを保証しますか?完全なソースコードにアクセスできない場合は、おそらく互換性の問題を自分で解決しようとすることはあまり幸運ではないでしょう。そのため、ソフトウェアを購入するだけでなく、サプライヤとの長期保守契約も考慮する必要があります。


これは実際にはかなり良いアドバイスです!
T.サール-復活モニカ

確かにですが、残念ながら遅すぎます。Basileのコメントにコメントしたように、サプライヤーにもこの質問をしました。しかし、私は、それはここで良い議論のポイントになると考えられており、将来的には他の人のための良い将来の参照
MawgはREINSTATEモニカ言う

4

当社は、衛星通信用の大きくて非常に複雑なソースコードを購入します。これはC ++でコーディングされており、C ++でもコードに追加をコーディングし、購入したコードとコードを単一の実行可能ユニットにリンクします。

いいですね!

購入したコードの開発に使用したのと同じコンパイラーおよび同じコンパイラーのバージョンを使用する必要がありますか?

一般的に言えば、いやそれは必要ありません。C ++の目的は、これらの種類の事柄に対する抽象化として機能することです。そのため、適切に作成されたC ++プログラムは、元の作成者と同じようにツールチェーンでコンパイルされ、結果のプログラムは同じ結果になります。異なるコンパイラーは異なることで優れているため、パフォーマンスは異なる場合がありますが、プログラムの基本的な動作は変わらないはずです。

ただし、不適切に作成されたソフトウェアは、実装固有の動作、または未定義の動作に依存する場合があります。組み込み型、またはプラットフォームのエンディアンネスについて仮定する場合があります。よく書かれたソフトウェアでさえ、選択したツールチェーンで利用できない非標準の拡張機能に依存する以外に選択肢がない場合があります。または、元のプロジェクト。

最終的には、作成者/ベンダーにソースコードの目的を尋ねる必要があります。たとえばVisual Studio 2015向けに特別に作成されており、Windows API機能が必要であると彼らが主張している場合は、おそらくそれに従う必要があります。しかし、彼らがそれが移植可能な標準C ++であると主張するなら、あなたが好きなコンパイラを使用してください。ベンダーが嘘をついていることが判明した場合に無料のヘルプを得ることができるように、購入契約にサポート契約が含まれていることを確認してください。

購入したコードと同じバージョンのC ++を使用する必要がありますか?それは2014を使用していない場合、我々は可能性があることのいくつかの機能を使用したいのですが、異なるバージョンを混合しながらいくつかの問題があるかもしれないではない場合。

多分。多分。

C ++ 03はほとんどの部分で上位互換性があるため、コードがC ++ 03であれば、問題は発生しそうにありません。(ただし、微調整が必​​要になる場合があります。)

しかし、C ++ 11およびC ++ 14で導入された機能には下位互換性がないため、ベンダーがC ++ 11ラムダなどを使用し、C ++ 03コンパイラでコードをビルドしようとすると、動作しません。

理論上はもちろん、特に言語バージョンは重要ではありませんが、コンパイラのバージョンが異なると異なるオブジェクトコードが生成され、タイミングの違いなどが発生する可能性が考えられます。

絶対に。期待される結果を得るためにコードが特定の実装に大きく依存している場合、責任を負ってそのことを通知するのはベンダー次第です。私たちは現実の世界に住んでいるので、私は勤勉で、最初に尋ねることをお勧めします。

そして、私は他の人が言ったことをエコーし​​ます:何らかの種類のサポート手段を持っていることを確認してください。そうすれば、彼らがこれらの質問に対する回答のいずれかを意図的にまたはそれ以外で誤って伝えた場合、結果として生じるコストを背負わないことになります。


注目に値する:リンクはC ++仕様で完全にカバーされていません。コードは複数の適合コンパイラでコンパイルされる場合がありますが、それらを一緒にリンクして動作させることができるという保証はありません。
コートアンモン-復活モニカ

1
@CortAmmon:結果のディストリビューションのすべてのコンポーネントを、ABIを共有するツールチェーンでコンパイルする必要があります。ABI標準はC ++の範囲外です。とにかく、OPがツールチェーンのミキシングについて尋ねているとは思わない。
モニカとライトネスレース

2

コードをリンクするのではなく、コンパイル済みのオブジェクトファイルをリンクします。

この場合はい複数のC APIを使用してパーツが相互に通信する場合のアプリケーション。

コンテナや例外などの機能は同じインターフェースを提供しますが、バイナリレベルでは、多くの異なる互換性のない方法で実装できます。

ただし、別のコンパイラを使用してコード全体をコンパイルすることは別の問題です。考慮すべき質問:

  • コードが対象とするプラットフォーム/アーキテクチャは何ですか?
  • どの標準のために書かれましたか?
  • 非標準のコンパイラ機能を使用していますか?
  • コードには、ハードコーディングされたプラットフォーム固有の前提条件が含まれていますか(常にポインターが2バイトを占有していると考えるなど)?

また、未定義の動作を引き起こす部分がコードに含まれる可能性もあります。これらは、あるコンパイラーを使用すると正常に機能するように見えますが、別のコンパイラーを使用すると不可解な方法で失敗します。


OPはベンダーではなくコードを構築しています。OPは、同じコードベースが与えられた場合、ビルド環境の変更(ベンダーのものを参照)がコード生成にどのように影響するかを尋ねています。
ライトネスレース、モニカと

1

購入したコードの開発に使用したのと同じコンパイラーおよび同じコンパイラーのバージョンを使用する必要がありますか?

コンパイラを切り替えると、いくつかの問題が発生する可能性があります。現在、私の会社では、ClangとMSVCを使用していますが、一方のコンパイラでエラーがあり、もう一方のコンパイラではそのようにマークされていません。

購入したコードと同じバージョンのC ++を使用する必要がありますか?それは2014を使用していない場合、我々は可能性があることのいくつかの機能を使用したいのですが、異なるバージョンを混合しながらいくつかの問題があるかもしれないではない場合。

必ずしも必要ではありませんが、もちろんコンパイラーは使用したいC ++バージョンをサポートする必要があります。C ++は、すべてのバージョンからレトロ互換性を保証します。


ほぼ私の考え。コンパイラのバージョンについてはどうですか?たとえば、GCCバージョンxを使用し、最新バージョンがx + 2である場合はどうでしょうか?
Mawgは、モニカを

1
使用したいコンパイラの古いバージョンを使用している場合、問題はありません。廃止されたものなどないため、新しいバージョンのコンパイラを使用している場合に問題が発生する可能性があります。
ラボパイ

しかし、どのように?私も、woudlは好まない。しかし、発生する可能性のある問題を認識していますか?
Mawgはモニカ回復言う

しかし、発生する可能性のある問題を認識していますか?コンパイラがサポートしない機能を使用している場合、コードは単にコンパイルされません。
ラボパイ

1
ちょっとした付録ですが、他のオフィスで使用されているコンパイラが主要なものではない場合、問題はもちろん大きくなります。たとえば、古いコンソールコンパイラ、または言語のサブセットで動作するもの。
ラボパイ

1

コンパイラーを変更するときの大きな問題の1つは、未定義の動作です:受け取ったコードが未定義の動作を呼び出す場合、何でも可能です-コンパイラーを使用するときにコードが正常に動作し、すべてのテストに合格し、コンパイラーでひどく間違っていることを含む。

それは可能ですが、その状況では、最適化レベルを変更したり、同じコンパイラの次のバージョンを使用したりすると、問題が発生する可能性があります。避けられるものは何もありません。


これは、lintおよび多分valgrindを使用するための適切な引数です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.