web-dev-qa-db-ja.com

Linuxでgccの簡単なメイクファイルを作成するにはどうすればよいですか?

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

program.cには、program.hおよびheaders.hが含まれます。

Linuxでgccコンパイラを使用してこれをコンパイルする必要があります。これを行う方法がわかりません。 Netbeansは私のために作成しましたが、空です。

117
user69514

興味深いことに、ソースファイルに関する規則が与えられている場合、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

メイクファイルで通常見られる$(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を使用しないでください。お願いだから! :)

184
Joey Adams

たとえば、次の単純なMakefileで十分です。

 CC = gcc 
 CFLAGS = -Wall 
 
 all:プログラム
 program:program.o 
 program.o:プログラム.c program.h headers.h 
 
 clean:
 rm -f program program.o 
 run:program 
 ./program 

クリーンアップして実行した後の次の行には、スペースではなく<tab>が必要であることに注意してください。

UPDATE以下のコメントが適用されました

24
Viliam
all: program
program.o: program.h headers.h

十分です。残りは暗黙的です

12
anonymous

最も単純なmakeファイルは

all : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

clean :
        rm test *.o
9
Indrakumar

ヘッダーの数と開発習慣に応じて、gccmakedepを調査することができます。このプログラムは、現在のディレクトリを調べ、各.c/cppファイルのヘッダー依存関係をメイクファイルの最後に追加します。 2つのヘッダーと1つのプログラムファイルがある場合、これは過剰です。ただし、5個以上の小さなテストプログラムがあり、10個のヘッダーのいずれかを編集している場合、makeを信頼して、変更によって変更されたプログラムを正確に再構築できます。

0
ThomasS