web-dev-qa-db-ja.com

C / C ++プログラムはどのように異なるプラットフォームに移植されますか?

Javaアプリケーションは、各プラットフォーム用に特別に開発された仮想マシン上で常に実行されるため、さまざまなプラットフォームで実行できます。したがって、ネイティブインストールはありません。コンパイルしたjarをどこかにドロップして実行するだけです。

今、私はC/C++開発の詳細にあまり慣れていません。だから私は好奇心が強いのですが、C/C++プログラムを移植して、異なるプラットフォームでネイティブに実行する方法を教えてください。一般的な手順は次のとおりです。

1-ウィンドウに「Hello World」という単語を表示するだけのGUIでプログラムを作成します。

2- Windows OSでインストーラー(.exeファイル)を実行してインストールされるようにパッケージ化します。

3- Linuxでコンソールのapt-getコマンドを使用してインストールされるようにパッケージ化します。

4- Mac OSXでは、「アプリケーション」フォルダにドロップすることでインストールされるようにパッケージ化します。

「Hello World」ウィンドウを表示するにはどのライブラリを使用しますか?このライブラリは、いくつかのプラットフォームで動作するようにどのように作成されましたか?このライブラリには、プラットフォームごとに異なるバージョンがありますか?もしそうなら、それは私が特定のプラットフォーム用にプログラムをパッケージ化するたびに、特定のプラットフォーム用のライブラリの特定のバージョンを使用してコンパイルしなければならないことを意味しますか?

私はこのプロセスがどのように機能するかについての一般的な理解を得ようとしています。 C/C++開発者がパッケージ化プロセスに一般的に使用するいくつかの頼りになるツールを聞いていただければ嬉しいです。

5
AxiomaticNexus

次の2つの問題があります。

  • 移植 をいくつかのオペレーティングシステムに簡単に変換できるCまたはC++プログラムのコーディング方法。最も簡単な方法は、 Qt または [〜#〜] poco [〜#〜] (または libsdl などのクロスプラットフォームフレームワークライブラリを使用することです=または [〜#〜] gtk [〜#〜] )これは、いくつかのプラットフォームに移植され、抽象化の共通セットを提供します。 purelyC99 または C++ 11 標準準拠コード-なしに制限することもできます外部の標準化されていないライブラリ(ただし、書き込むことができない多くのアプリケーションがあります。例 this を参照してください)。 [〜#〜] posix [〜#〜] の指定が存在することに注意してください(ただし、GUIアプリケーションには何もありません)。これに従えば、すべてのコードをコンパイルして実行できるはずです。 POSIX準拠(別名 NIX標準 )オペレーティングシステム(例 LinuxMacOSX[〜#〜] aix [〜#〜 ] などですが、 Windows ではありません)。それ以外の場合は、条件付きコンパイル(#ifプリプロセッサディレクティブ)を使用して、すべてのオペレーティングシステム固有のサービスをいくつかの変換単位でラップすることをお勧めします(残りのコードで使用されます)。

  • どのように パッケージデプロイ 異なるオペレーティングシステム上でプログラム(CまたはC++ソースコードをコンパイルすることによって生成されます)。これはOS固有のものであり、Linuxでもさまざまです distributions 異なる パッケージマネージャー :DebianとRedhatで異なることを行う必要があります(おそらく異なるものでさえも) Linuxディストリビューションのさまざまなバージョンの場合)、Debianには *.deb パッケージがapt-getまたはdpkgとともにインストールされていますが、Redhatには *.rpmyumまたはrpmでインストールされたパッケージ!ただし、LinuxではFHS( ファイルシステム階層標準 )は、ソフトウェアのファイルの移動先を定義するので役立ちます(ただし、インストール方法は、ディストリビューションまたはパッケージマネージャー固有です)。

プログラムを フリーソフトウェア としてソース形式で(たとえば github として)開発および配布し、(上級)ユーザーおよびシステム管理者にソースコードをコンパイルしてインストールします(次に、特定の場所、たとえば/usr/local/bin/の下にバイナリをコピーし、構成ファイルを/etc/などの下にコピーするインストールスクリプトを実行します。 )。最終的に無料ソフトウェアはほとんどのLinuxディストリビューションでパッケージ化される可能性があり、一部の外部の貢献者はコードを拡張する(または他のオペレーティングシステムに移植する)パッチを提供します。

依存関係の地獄 は常に問題になる可能性があります(特定の外部ライブラリの特定のバージョンが必要になる場合があるため)-言語にあまり依存しないため、Javaも!-しかし、パッケージマネージャーは多かれ少なかれそれを扱っています。

可搬性 (これは一部の仕様に関連しています)はほとんどが考え方または理想です:よく知られた引用(私は帰属を忘れました)は「移植性のあるプログラムはありません、一部のターゲットシステムに移植された一部のプログラムのみがあります "(Javaを含む多くのプログラミング言語にも当てはまります)。

ところで、一部のプログラムはプレーン 実行可能 バイナリ(のみ)にコンパイルされます。その他のプログラムでは、構成ファイル、外部リソース(フォント、グラフィックイメージ、Webまたはテキストテンプレート、データファイル、スクリプトファイルなど)または依存関係が必要です。そのため、展開の複雑さは大きく異なる場合があります。たとえば、 GNU emacs (または firefox browser)のインストールとデプロイは、コマンドラインの「hello world」プログラム(ほぼ常に単一の実行可能ファイル)。対象のシステムにすでにrightバージョンのQtが適切にインストールされていると想定している場合、Qtベースのグラフィカルな「hello world」プログラムはおそらくインストールが簡単です。 (通常の場所と構成で)。

注意:CまたはC++標準では、実装をコンピューター上で実行する必要はありません(原則として、標準に準拠したC99またはC++ 11の実装には、人間の奴隷の束を非倫理的に使用することができます)。コンパイラ。しかし、ほとんどの実装はコンパイルされています(ただし、一部のCインタープリターは存在します)。

14