小規模なプロジェクトで「make」を使用する利点は何ですか?[閉まっている]


8

これはmake、特にで説明されている複雑な依存関係がありMakefile、ワークフローにも役立つ大規模なプロジェクトに役立つことがわかりました。make小さなプロジェクトで使うことの利点は聞いていません。いずれかがあります?


2
成長のための楽観主義?:) 良い習慣?これは意見の領土に迷い込むかもしれません。
ジェフシャラー

入力makeして答えを見つけてください。まともなテンプレートMakefileを作成し、そのソースファイル変数を編集するだけです。すべてのジャズを入力する必要はありません。
user2497

それらは大規模なプロジェクトにとっては悪夢のようなものなので、正直なところ、小規模なプロジェクトにのみ有効だと思います;)
Eevee

私はメイクファイルを使用できましたが、できません。私の最大の(個人的な)プロジェクトのソースコードを10個のファイルに分割し、最初のファイルを再コンパイルしました。最初のファイルには他の9個の#includeがあります。再コンパイルの速度が速いので、毎回すべてが再コンパイルされるかどうかは私には関係ありません。
ジェニファー

1
怠惰:-) make依存関係をきれいに処理するスマートなMakefileを作成しなくても、他のほとんどのコマンドよりも入力するコマンドがはるかに速い:-)
Stephen Harris

回答:


11

何とは対照的に?

あなたは、あなたが想像しているという名前の2つのファイルに分割されていることをプログラムがあるとfile1.cしてを  file2.c。実行することでプログラムをコンパイルできます

cc file1.c file2.c -o yourprogram

ただし、一方のみが変更された場合でも、両方のファイルを毎回再コンパイルする必要があります。コンパイル手順を次のように分解できます。

cc -c file1.c
cc -c file2.c
cc    file1.o file2.o -o yourprogram

次に、ファイルの1つを編集するときは、そのファイルのみを再コンパイルします(変更内容に関係なく、リンク手順を実行します)。しかし、何を、あなたは一つのファイルを編集し、あれば、その後、他の、 そしてあなたが誤って再コンパイルのみ1両方のファイルを編集して、ということを忘れて?

また、ファイルが2つしかない場合でも、そこには約60文字分のコマンドがあります。それはすぐにタイプするのに退屈になります。確かに、それらをスクリプトに入れることはできますが、その後は毎回再コンパイルする必要があります。または、どのファイルが変更されたかをチェックし、必要なコンパイルのみを実行する、本当に豪華で複雑なスクリプトを書くこともできます。これでどこへ行くのか分かりますか?


以下のために非常に小さなプロジェクト、gcc -O3 -march=native -fwhole-program *.c 編集/コンパイル/プロフィールサイクルのために基本的に大丈夫です。しかし、それでも他の人が使用するMakefile が必要です。使用できること-fwhole-programは、すべてを一緒にコンパイルする楽しい利点ですが、-flto通常はほぼ同じ最適化を提供します。
Peter Cordes

2
コンパイラのコマンドラインにスイッチを追加し始めたら(たとえ1つのソースファイルであっても)、次回それらを覚えるのが難しいことに気づきました。...時折私は、ソースファイルにコメントを入れますが、その時点で私はMakefileを使用する必要があります
ロジャーLipscombe

@ger Lipscombe:異なる環境用にコンパイルする必要がある場合は、メイクファイルでいくつかのマクロを定義するのと同じくらい簡単です。そして、少しの創造性で、makeコマンドを編集機能キーにフックし、出力をファイルにキャプチャし、別のキーを使用して、エラーの位置に移動できます...
jamesqf

15

他の多くの人々は、より複雑なmakefileの詳細と、それらに伴う複雑さの多くに取り組んでいます。私は通常、完全に異なる理由でメイクファイルを使用します。

何も覚えたくない。

プロジェクトが本当に退屈でシンプルで、makefileを「正しく」使用していない場合でも、

all:
    gcc main.c -o project

私はそれについて考えたり、より複雑なプロジェクトと違った扱いをする必要はありません。

all:
    gcc libA.c libB.c main.c -o project2

または、フラグ(など-O2)を指定した場合、フラグを覚えておく必要はありません。

また、単純なmakefileから始めて、後でマージ/リファクタリングする必要がある場合、すべてのプロジェクトを別々にビルドすることを覚えておく必要はありません。


コンパイルされていないプロジェクトでもメイクファイルを使用します。関係するディレクトリのみに関連する複雑なコマンドを実行する「偽の」ルールを作成します。例:クリーンアップ、正しい場所へのインストール、Dockerイメージのインストール。それだけで簡単になります。
アンソニー

5

小さなプロジェクトでも、依存関係のロジックを制御し、ビルドを自動化するのに役立ちます。インストールとアンインストールをトリガーするためにも使用したため、ステージをリセットするメインスイッチでした。


3

2つのソース(.cファイル)からアプリをリンクする場合、各ファイルを再コンパイルする必要はありませんが、makeを使用している場合は変更されたファイルのみを再コンパイルする必要があります。

また、BSDの世界の例を紹介します。彼らはシステムベースのメイクファイルのフレームワークを持っています。それらはシステムディレクトリへのパスを提供し、ソフトウェアとマニュアルページをインストールするためのターゲットを持っています。

たとえば、beer.cアプリとマニュアルを作成し、その名前を付けましたbeer.6。あなたが作成しますMakefile

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..andコールmake install。それはあなたのアプリを自動的にコンパイルしてインストールし、それを見つけること/usr/binmanできる場所にあなたのマニュアルページをコンパイルしてインストールします。1つの簡単なコマンドでアプリをインストールしました!

BSDに慣れている人にとっては非常に便利で完全に透過的です。手動スクリプトよりもはるかに優れています。


1

Makefile私の非常に小さなプロジェクトの例:getPixelColor

2つのオプションの引数、座標を取り、その名前のとおりです。

私は、物事がそこで依存する方法が特に好きです。

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
    ./$(BIN) $(COORDS)

ご覧のとおり、余分な入力をせずに、必要なすべてを実行できます。


使用法

次の方法で実行できます。

  1. 古いバイナリをクリーンアップします。

    make clean
  2. 新しいバイナリをコンパイルします。

    make
  3. 2つの方法で実行可能ファイルを実行します。

    • デフォルトの座標[0,0]

      make run     # equals COORDS='0 0'
    • 与えられた座標

      COORDS='5 6' make run

Makefileは時に非常に役立ちます。プロジェクトが大きいほど、利益も大きくなります。しかし、私の最小のC ++プロジェクトを使用しても、例を見るとわかるように、頭痛の種を大幅に減らすことができます。


0

makeかなり確実に利用できます。を使用してプロジェクトを配布する場合makefile、ユーザーは、同じ方法でタスクを実行する方法について簡単なリファレンスを入手できます。makefileただ、コンパイルより長くすることができます。

たとえば、コンパイルを必要としないプロジェクトを考えてみましょう。すべての.pycファイルをクリアするmakeコマンド、テストを実行するmakeコマンド、開発サーバーから静的データのコピーをダウンロードするmakeコマンドなどがあるPythonプロジェクトで作業したことを思い出しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.