[解決済み] Linux で gcc 用の簡単な makefile を作るには?
質問
3つのファイルがあります。
program.c
,
program.h
と
headers.h
.
program.c
には
program.h
と
headers.h
.
Linuxでこれをコンパイルするには gcc コンパイラでコンパイルする必要があります。 私はこれを行う方法がわかりません。Netbeansは私のために1つを作成しましたが、それは空です。
どのように解決するのですか?
興味深いことに、make がソースファイルに関する規則を考慮して C コンパイラをデフォルトで使用することは知りませんでした。
とにかく、単純な Makefile の概念を示す単純な解決策は、次のようなものです。
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(makeではスペースインデントではなくタブインデントが必要なので、コピーの際に修正することをお忘れなく)
しかし、より多くのCファイルをサポートするためには、それぞれのファイルに対して新しいルールを作らなければなりません。 したがって、改善のために
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
makefileで通常見られる$(CC)や$(CFLAGS)といった変数を省略し、できるだけシンプルにすることを心がけました。 もし、あなたがそれを理解することに興味があるのなら、私はあなたにその良いスタートを与えることができたと思います。
以下は、私が C ソース用に好んで使っている Makefile です。 ご自由にお使いください。
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
make ユーティリティのワイルドカードと patsubst 機能を使って、 カレントディレクトリの .c と .h ファイルを自動的にインクルードします。 つまり、新しいコードファイルをディレクトリに追加しても、 Makefile を更新する必要がありません。 ただし、生成される実行ファイルの名前やライブラリ、コンパイラのフラグを変更したい場合は、変数を変更すればよいのです。
どちらにしても、autoconf は使わないでください。 お願いだから! :)
関連
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] プログラムがクラッシュしたときにスタックトレースを自動的に生成する方法
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットにするルールがありません)
-
[解決済み】数行のコードに対してGCCの警告を無効化する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?