dポイントプレゼントキャンペーン実施中!

別PCでコンパイルしたCプログラムについて教えてください。

別PCでコンパイルしたCプログラムは、別のPC(CPU等の構成は違うが、同一のLINUX)でも動作するのでしょうか。

1コア32ビットのCPUでコンパイルしたものと、2コア32ビットのCPUでコンパイルしたものは同一のバイナリになるのでしょうか?(コンパイラによる最適化が行われないのでしょうか?)

よろしくお願いします。

A 回答 (3件)

> 別PCでコンパイルしたCプログラムは、別のPC(CPU等の構成は違うが、同一のLINUX)でも動作するのでしょうか。


セルフコンパイルであるとの前提でお答えします。
基本的には動作しません。というよりか動作保証はされません。
ただし、たまたまコンパイル環境と実行環境が似ている場合は
動作することもありますがおすすめできません。

>1コア32ビットのCPUでコンパイルしたものと、2コア32ビットのCPUでコンパイルしたものは同一のバイナリになるのでしょうか?
基本的には違うでしょう。

CPUには新しい命令セットが追加されていきますのでコンパイラもそれに合わせて
進化していきますから、コアが複数あるというよりかCPUが違えばバイナリは違う可能性は
高いです。
これもまたCPUが近ければ同じようなバイナリを吐いてくれるかもしれませんが。
また、コンパイラも最適化アルゴリズム等どんどん進化しています。
>(コンパイラによる最適化が行われないのでしょうか?)
コンパイラがgccであるとの前提にお答えします。
最適化はデフォルトではされると思いますが、コンパイルスイッチで切り替えれます。
(-Oオプション)
    • good
    • 0

ソフトウェアの動作可否は、APIとかライブラリーとかの互換性で


同じアーキテクチャのCPUにおいて、CPUの違いが問題になることは少ないですね。

実際にLinuxで、いろんなソフトをソースからコンパイルしてみれば
ライブラリー不足でmakeできないという例はいくらでも出てきます。

ライブラリーは静的リンクされるものと、動的リンクで利用されるものがあり
ソフトウェアの実行時にエラーが出るのは、動的リンクされるものです。


このほか、コンパイルするにあたって、与えられるコンパイルオプションの問題もあります。
CPUコアがいっぱいでうれしいといえば動画エンコードで
動画エンコードのフリーソフトウェアといえば、WindowsでもLinuxでもffmpeg。
というわけで、ffmpegのコンパイル手順を紹介する記事はよくあるのですが
これ読んでみると、いくつかのオプションが、その名称から意味をつかめると思います。

ffmpegの場合は、そのオプションが実行時に表示されるようになっているので
教材としてもいいですね。aptやyumで導入したものでもいいので、コンソール上で
ffmpegを実行してみると、たとえばうちで動いているものだと…

≫FFmpeg version UNKNOWN, Copyright (c) 2000-2009 Fabrice Bellard, et al.
≫ configuration: --enable-gpl --enable-nonfree --enable-postproc --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libmp3lame --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --enable-shared --disable-debug
≫ libavutil 49.12. 0 / 49.12. 0
≫ libavcodec 52. 9. 0 / 52. 9. 0
≫ libavformat 52.23. 1 / 52.23. 1
≫ libavdevice 52. 1. 0 / 52. 1. 0
≫ libpostproc 51. 2. 0 / 51. 2. 0
≫ built on Oct 26 2009 21:39:15, gcc: 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
≫At least one output file must be specified

と表示されます。
lib....と表示されているのが静的リンクされたライブラリーだと思っています。
その上に表示されているのがコンパイルオプションで
--enable-pthreadsオプションが、CPUコアの数(というか同時実行スレッド数)に関わるオプションで
いわゆるマルチスレッドエンコードを可能にするオプションです。
Windows版のFFMPEGであれば、--enable-w32threadsオプションです。

つまり、そういうのは自動的にコンパイラが決めるのではなく
makeの前のconfigureスクリプトのオプションなどで設定すべきものです。
何かコンパイルする際に、その前に用意されていることの多いconfigureスクリプトには
--helpオプションがついていることもあるので、見てみましょう。
本当は、readmeとか読むべきなんですけど…まぁ、私も英文は苦手なので(略)

で、実際の実行環境としては、仮に同じOSを同じ設定で使っているのであれば
シングルスレッド環境で--enable-pthreadsオプションをつけてコンパイルし
それをその環境で実行することも、マルチスレッド環境で実行することも可能です。

実行時のマルチスレッド処理は、半分はOS側で管理され
残り半分は、(ソフトウェアによっては)実行時オプションによって指定されます。
たとえばffmpegであれば、-threads 3といったオプションで利用するコア数を指定できます。

もちろんそれにはOS KernelがSMP対応でmakeされている必要もあり
実際の挙動や実行オプションの与え方などは多種多様だと思います。

字数が尽きますので割愛しますが…
一般的なLinuxはi386最適化やPentium最適化で
SSE2などを利用できない状態でmakeされたソフトが含まれていたりします。
64bit版を選択すると、より新しいCPUへ最適化されているので
64bit化以外の部分で高速化することもあります。
    • good
    • 0

OSが同じなら動きます。

Linuxと言っても種類はたくさんありますから、違う場合、たとえばRedhatとCentOSとでは、互換がない場合もあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!