こんにちは。
質問①
同一のC++のソースコードからバイナリを生成するとき、
生成される実行ファイルのバイナリは何の影響を受けるのでしょうか?
e.x. コンパイラのバージョン、CPUの種類(Intelであれば全部一緒?)、ライブラリのバージョン など
「同じバイナリ」=「全く同じ機能のバイナリ」とした場合は、以下の通りです。
- コンパイラとCPUの影響は当然受けます。ただし、CPUが異なっても入力が同じなら出力も同じというコンパイラが存在すれば影響を回避できます。(本質的にはそのようなコンパイラが存在する可能性はあります。例えば、コンパイラの同じバイナリが走るなら、期待できるでしょう。)
- リンクする全てのライブラリもバイナリ・レベルで同じである必要があります。
ターゲット・マシンのアプリがクロス開発環境では走らないならリンクするライブラリを管理しやすいです。クロス環境でも走るようなケースでは、クロス環境に何かアプリをインストールする際に、ターゲットのアプリにリンクしているライブラリが更新されることもあるので、なかなかハードです。
3. 当たり前ですが、ソース(インクルードするライブラリのヘッダも含めて)が、同じバイナリを出力するものであることも必要です。(コメントがちょっと変わっているくらいの変更は問題ないはずですし、変数名や関数名も外部リンケージのないものなら異なっていても大丈夫な筈です。)
4. コンパイラやリンカへ与えるオプションや環境変数も同じバイナリを出力できるものである必要があります。ターゲット環境とクロス環境の両方で同じバイナリを出力させる設定は結構難易度高いと思います。
他には影響する要素はないと思います。(見落としていたらごめんなさい。)
でも、これらを全て満たすのは現実問題無理な気がします。手間が凄いことになりそうです。
質問②
ある環境(低スペックのPC)でコンパイルした結果と同一のバイナリを
別の環境(ハイスペックのPC)で生成しようと思った時、
どのようにしてバイナリを一致させるのが良いのでしょうか?
CmakeListなどから依存するライブラリ一覧などを抜き出せないでしょうか。
Ubuntuで走るアプリには恐らくビルド時刻が埋め込まれていると思いますので、現実問題不可能と思います。ビルド時刻やデバッグ情報等のリリース・モードでの実行のためには必要でない情報を全て剥ぎ取るようなツールがあれば理論上は可能ですが、OS上で走るアプリに対してそのようなことが可能なツールを見たことはないです。(OS無しで走らせる場合ならROM化することが多いですが、ROMイメージを出力するツールは不要な情報を全て剥ぎ取ることができる筈です。)