web-dev-qa-db-ja.com

Cmake、gnu make、および手動コンパイルの違い

私はプログラミングが初めてなので、これは技術的な質問というよりも抽象的な質問です。私は学習のためにIDEを使用していましたが、実行可能ファイルを作成するときに、コンパイル、アセンブル、およびリンクの動作を単純化しすぎる傾向があると聞きました。

IDE(この場合はlibrocket)に依存せずにライブラリをダウンロードしてコンパイルしようとしています。最初にCmakeを使用してバイナリを作成する必要がありました。構成および生成後、 t出力ディレクトリにオブジェクトファイルまたは.cppファイルがある場合、gnu makeコマンドを使用して、出力ディレクトリにオブジェクトファイルと.cppファイルの両方を作成する必要がありました。

Cmakeとgnu makeは、ソースコードをダウンロードしてから実際にオブジェクトファイルを作成するまでにどのようなステップを実行しますか?コンパイラとリンカーは実際にどの時点で呼び出されますか?

書いたテストライブラリを正常にコンパイルし、g ++を使用してそれにリンクする別のプログラムをコンパイルしましたが、コンパイラを直接呼び出す代わりにCmakeとgnu makeを使用する必要があるため、少し迷っています。

26
kristhedemented

Cmakeは「プロジェクトジェネレーター」です。実際にはオブジェクトファイルなどを構築しません。それが行うことは、オブジェクトファイルなどを構築する他のツール(GNU make)など)の制御ファイルを生成することです。

Makefileを直接記述する代わりにcmakeを使用する利点は、同じcmake入力ファイルを使用して、あらゆる種類の異なるビルド制御ツール用のプロジェクトファイルを生成できることです。makefileに加えて、Xcode(Mac OS X)プロジェクトファイルを生成できます。 、Microsoft Visual Studioプロジェクトファイル、Ninjaなどの他のツールの制御ファイル。さまざまなプラットフォームで構築する必要があるソフトウェアを作成している場合、多くの場合、cmakeが適切な選択です。

あなたの状況では、次のようになります:cmakeは一連のmakefile(のみ)を生成します。通常、これは、クリーンなワークスペースがある場合に1回だけ行います。次に、さまざまなファイルが変更されたときに、必要に応じてこれらのメイクファイルを使用してコンパイラを起動するmakeを実行します。メイクファイルには、cmake入力ファイルのいずれかが変更された場合にcmake自体を再実行するルールもあります。

27
MadScientist