0

少し経験がありますが、異なる Linux バージョン (CentOS リリース 4.7 、Ubuntu 8.10)、異なるビット (例: 32 ビット、64 ビット) および異なるバージョンのコンパイラ (例: gcc/g++ 3.4.6 20060404 (Red Hat 3.4.6-10)、gcc/g++ (Ubuntu 4.3.2) -1ubuntu12) 4.3.2.)、実行可能ファイルまたはライブラリ ファイルをこれらの異なるマシンで使用できるようにするには? ここでの原則は何ですか?

たとえば、ネットワーク ファイル システムでは、CentOS リリース 4.7、x86_64 ad gcc/g++ 3.4.6 20060404 (Red Hat 3.4.6-10) のマシンで C++ プログラムからビルドされた実行可能ファイルがあります。驚いたことに、Ubuntu 8.10、x86_64、および gcc/g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2 を搭載した別のマシンで実行可能ファイルを使用できることがわかりました。また、最初のマシンで構築し、プログラムで使用したすべての共有ライブラリは、実行可能ファイルが 2 番目のマシンで実行されているときにエラーを報告しません。別のマシンでビルドされた実行可能ファイルを実行すると、信頼できる結果が得られるかどうか心配です。

別の例として、64 ビット マシンでビルドされた実行可能ファイルは 32 ビット マシンでは実行できないことを覚えています。しかし、逆に、32 ビット マシンでビルドされた実行可能ファイルを 64 ビット マシンで実行するにはどうすればよいでしょうか。さまざまなビット マシンでビルドおよび使用される C++ ライブラリ ファイルについてはどうでしょうか。

可能であれば、ウェブページや本など、私の質問に関連する参考文献を教えていただけますか?

よろしくお願いします!

4

1 に答える 1

0

確実に確認するには、異なる構成ごとにプログラムをテストする必要があります。

通常、32 ビット プログラムは 64 ビット マシンで実行できるため、必要に応じて 32 ビット バージョンだけで済む可能性があります。

各プラットフォームで使用された gcc のバージョンに少し注意する必要があります。OS と glibc が gcc 3 でビルドされたマシンで gcc 4 でビルドされたプログラムを実行すると、問題が発生する可能性があります。そのため、少なくともメジャー バージョン番号が一致していることを確認してください。

明らかに、マシン アーキテクチャが異なる場合、たとえば Sparc と AMD64 では、異なるバージョンが必要になります。Intel と AMD の間には微妙な違いさえあるので、コンパイラの最適化に積極的に取り組まないでください。プログラムで SSE 命令を使用している場合 (これが何であるかわからない場合は、それを使用していません)、使用する SSE セットは、すべてのマシンでサポートされています。

ここでの重要な問題は、マシン アーキテクチャ、適切なライブラリの可用性、および「ABI」またはアプリケーション バイナリ インターフェイスです。ABI は、OS がマシン レジスタとメモリを使用してプログラムのさまざまな部分間で情報を渡す方法を指定します。たとえば、関数に引数を渡すためにデータをスタックにプッシュする方法です。GCC で使用される ABI は時々変更されることが知られているため、互換性のあるバージョンを使用する必要があります。

これらすべてをカバーしている本や Web ページを私は知りません。GCC と Binutils のドキュメントから始めます。そして、良いテストに代わるものはありません。

于 2009-08-19T17:38:22.570 に答える