Linuxでgccの単純なmakefileを作成するにはどうすればよいですか?


130

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

program.c含まれprogram.hていheaders.hます。

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


1
spin.atomicobject.com/2016/08/26/makefile-c-projectsには非常にエレガントな(そして十分に文書化された)ソリューションがあります。
ケーシー

回答:


193

興味深いことに、ソースファイルに関する規則を前提として、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を使用しないでください。お願いだよ!:)


7
技術的に正しいためには.PHONY: clean all default、コマンドラインから使用することを目的としたターゲットに使用する必要があると思います。また、Autoconf / Automakeはそれほど悪くありません。確かに、彼らはひどく感じ、慣れるのはレンガの壁に頭を押し付けるのと同じくらい楽しいですが、それらは機能し、十分に発達していて、移植性の範囲までほとんどのベースをカバーします、あなたが彼らのひどいデザインに慣れると、最終的にあなたの人生がずっと楽になります。
クリス・ルッツ

これはうまくいくと思いますが、ターミナルで「make」と入力すると、プログラムが実行されるはずです。これは私が得るものです:gcc statsh.o -Wall -lm -o prog makeと入力してプログラムを実行することは可能ですか?
user69514 2009

openmpフラグをどこに追加しますか-fopenmp
MySchizoBuddy 2013

1
autoconf joey-adamsを使用しないのはなぜですか?
ミカルゴンダ

7
なぜダッシュが前にあるのか不思議に思ったらrmstackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
Tor Klingberg

25

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

CC = gcc 
CFLAGS =-壁

すべて:プログラム
プログラム:program.o
program.o:program.c program.h headers.h

掃除:
    rm -fプログラムprogram.o
実行:プログラム
    。/プログラム

<tab>クリーンアップして実行した後、スペースではなく次の行にある必要があります。

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


@ user69514:make引数なしの場合、通常はソフトウェアをビルドするだけです。それを実行し、使用のいずれかにmake run(この答えでは、必ずしもそうではないが、すべてで利用可能なMakefileS)、またはそれを直接実行します./program
MestreLion

14
all: program
program.o: program.h headers.h

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


1
また、プログラム全体が単一の.cファイルである場合program:は、必要なものだけです。Sweet :)
MestreLion、2015年

10

最も簡単なメイクファイルは

all : test

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

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

clean :
        rm test *.o

Makefileの機能を説明する詳細を追加できます
Federico

2
あなたは実際にはもっと簡単に行くことができます。@anonymous 1 linerを参照
Mark

0

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

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