7

最初に、この質問は学校/宿題に関連していることを記しておきます。

コンピューター CP1 と CP2 が同じオペレーティング システムと機械語を共有しているとします。C プログラムが CP1 でコンパイルされている場合、CP2 に移動するには、ソース コードを転送して CP2 で再コンパイルするか、単にオブジェクト ファイルを転送する必要があります。

私の直感的な答えは、オブジェクト ファイルで十分だということです。C コードはコンパイラによってアセンブリに変換され、アセンブラによってマシン コードにアセンブルされます。アーキテクチャは同じマシン コードとオペレーティング システムを共有しているため、問題はありません。

しかし、考えれば考えるほど混乱してきます。

私の質問は次のとおりです。

a)実行可能ファイルではなくオブジェクトファイルを参照しているため、リンクがないと想定しています。CP2 でリンクするときに問題が発生することはありますか?

b) コードが CP1 で C11 標準を使用し、CP2 の唯一のコンパイラが C99 であった場合は問題になりますか? コードがコンパイル/アセンブルされたら、これは無関係だと思います。

c) 質問は、共有/動的リンク ライブラリを指定していません。したがって、これは、プログラムが .dll/.so/ .dylib ファイルに依存していない場合にのみ実際に機能します。そうでない場合、これらは CP2 でも必要になります。

非常に多くの落とし穴があるように感じます。質問がどれほど漠然としているのかを考えると、単純に再コンパイルする方が安全だと感じています。

ハーフ!

4

3 に答える 3

3

答えは、場合によります。C プログラムをコンパイルし、オブジェクト ファイルを移動して別のコンピューターにリンクすると、動作するはずです。しかし、エンディアン名前マングリングなどの要因により、プログラムが意図したとおりに動作しない可能性があり、実行しようとするとクラッシュする可能性さえあります。

C11コンパイラではサポートされてC99いませんが、ソースがコンパイルおよびアセンブルされているかどうかは問題ではありません。

ソースが 1 つのマシンでライブラリを使用してコンパイルされている限り、他のコンピューターでファイルをリンクまたは実行するためにライブラリは必要ありません (静的ライブラリのみ、動的ライブラリは実行するコンピューター上にある必要があります)。上のアプリケーション)。つまり、プログラムが意図したとおりに機能しない、またはクラッシュするという以前と同じ問題に遭遇しないように、プログラムを独立させる必要があります。

これらの問題に遭遇しないように、 EABIをサポートするコンパイラを入手できます。EABI をサポートするコンパイラは、他のそのようなコンパイラによって生成されたコードと互換性のあるオブジェクト コードを作成するため、開発者は、あるコンパイラで生成されたライブラリを別のコンパイラで生成されたオブジェクト コードとリンクできます。

私は以前にこれをやろうとしましたが、それほど多くはなく、最近でもありません。したがって、私の情報は 100% 正確ではない可能性があります。

于 2013-01-13T02:41:35.757 に答える
1

a) リンクされたバイナリを参照するために「オブジェクト ファイル」という用語が使用されているのを聞いたことがありますが、それはちょっと不正確ですが。つまり、「バイナリ」を意味するのかもしれません。オブジェクトファイルの形式が標準化されていない限り、別のマシンでのリンクは、コンパイラが異なる場合に問題になる可能性があると思いますが、それについてはわかりません。

b) バイナリコードが静的にリンクされている場合、異なる標準やコンパイラを使用しても問題ありません。動的ライブラリの関数に依存している場合、問題が発生する可能性があります。c) も同様に答える: はい、これは問題になります。必要なすべての動的ライブラリが正しいバージョンにない場合、プログラムは起動しません。リンク モード (静的か動的か) によって異なります。

于 2013-01-13T03:07:00.650 に答える
0

Q: コンピューター CP1 と CP2 が同じオペレーティング システムと機械語を共有しているとします。

A: その後、両方のコンピューターで同じ .exe を実行できます。

Q: C プログラムが CP1 でコンパイルされている場合、それを CP2 に移動するには、ソース コードを転送する必要がありますか?

A: いいえ。再コンパイルする場合にのみソース コードが必要です。別の互換性のない CPU や OS である場合にのみ、再コンパイルする必要があります。

「オブジェクトファイル」は通常、プログラムの実行にはまったく必要ありません。

http://en.wikipedia.org/wiki/Object_files

オブジェクト ファイルは、通常は直接実行できない再配置可能な形式のマシン コードを含むファイルです。オブジェクト ファイルは、アセンブラー、コンパイラー、またはその他の言語変換プログラムによって生成され、リンカーへの入力として使用されます。

「実行可能プログラム」には、1 つ以上の「共有ライブラリ」(別名 .dll) が必要な場合があります。その場合、同じ制限が適用されます。共有ライブラリがまだ常駐していない場合は、.exe と一緒にコピーする必要があり、CPU および OS と互換性がなければなりません。

最後に、「スクリプト」を再コンパイルする必要はありません。コンピューターからコンピューターへスクリプトを自由にコピーできます。ただし、各コンピューターには、スクリプトを実行するための「インタープリター」が必要です。Perl スクリプトには Perl インタープリター、Python スクリプトには Python インタープリターなどが必要です。

于 2013-01-13T05:54:25.300 に答える