1. ホーム
  2. c

[解決済み] Linux で gcc 用の簡単な makefile を作るには?

2022-05-26 07:05:59

質問

3つのファイルがあります。 program.c , program.hheaders.h .

program.c には program.hheaders.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 は使わないでください。 お願いだから! :)