5

私は現在 C を学んでおり、Makefile を作成する必要があるチュートリアルまで進んでいますが、複数のソースの Makefile を作成するのは困難です。複数のソースの Makefile のコードを修正する方法を教えてもらえますか? すべてのファイルは同じディレクトリにあり、filename1/2/3 などで示されるように合計 3 つの C ソース ファイルがあります。単一のメイクファイルに 3 つのソース ファイルを含む 3 つの個別のプログラムをビルドしようとしています。

 OPT = -O4              

all: filename1

filename1: filename1.o 
    gcc $(OPT) -o filename1 filename1.o

filename1.o: filename1.c
    gcc $(OPT) -c filename1.c

filename2: filename2.o 
    gcc $(OPT) -o filename2 filename2.o

filename2.o: filename2.c
    gcc $(OPT) -c filename2.c   

filename3: filename3.o 
    gcc $(OPT) -o filename3 filename3.o

filename3.o: filename3.c
    gcc $(OPT) -c filename3.c       
clean:
    rm -f *.o
    rm -f filename1
    rm -f filename2
    rm -f filename3

または、私のコードは、私がやりたいことに対して問題ありませんか?

4

5 に答える 5

4

makefileは機能するはずですが、単純化することもできます。

makeユーティリティは暗黙のルールをサポートします。これにより、Cソースコードファイルをオブジェクトファイルにコンパイルしたり、オブジェクトファイルを実行可能ファイルにコンパイルしたりするなどの一般的な操作を簡素化できます。

CC=gcc
CFLAGS=-O4

all: filename1 filename2 filename3

%.o: %.c
    $(CC) $(CFLAGS) -c $<

%: %.o
    $(CC) $(CFLAGS) -o $* $<

clean:
    rm -f *.o
    rm -f filename1
    rm -f filename2
    rm -f filename3
于 2012-10-11T02:46:42.257 に答える
4

3 つの異なるプログラムを作成していることを考えると、makefile に問題はないようです。それはうまくいくはずです。

もう少し使いやすくするためのいくつかの提案:

1) "all" および "clean" ターゲットが偽物であることを宣言します。これにより、Make が「all」および「clean」という名前のファイルを作成しようとするのを防ぎます。

.PHONY: all clean

2) おそらく、「all」ターゲットで 1 つだけでなく、3 つすべてのプログラムをビルドする必要があるため、次のように変更します。

all: filename1 filename2 filename3

3) これを使用して 3 つ以上のプログラムを作成することになり、それらがすべて同様のビルド手順を共有する場合は、パターン マッチを使用してルールを小さなセットにまとめることができます。例については、Martin Beckett の回答を参照してください。しかし、それは必要ありません。

于 2012-10-11T02:40:55.760 に答える
2

そのような3つのファイルから構築された3つの別々のプログラムの場合、次のように簡単に使用できます。

PROGRAMS = filename1 filename2 filename3

all: ${PROGRAMS}

clean:
    rm -f ${PROGRAMS} ${PROGRAMS:=.o}

あなたは追加するかもしれません:

CFLAGS = -O4

そのレベルの最適化を取得します。rmコマンドの代わりにマクロを使用することもできます。一般的に、成熟したmakefilesは多くのマクロを使用します。

RM_F = rm -f

GNU Makeをターゲットにしている場合は、次を追加できます。

.PHONY: all clean

そして、リストは続きます。

重要な点は、make単一ファイルプログラムをビルドする方法をすでに知っていることと、Cソースをオブジェクトファイルにコンパイルする方法を知っていることです。そのため、そのためにトレーニングする必要はありません。

于 2012-10-11T02:47:03.650 に答える
2

パターン マッチングを使用します。

PROGS = filename1 filename2 filename3

all: $(PROGS)

# cancel implicit program rule
%: %.c

%: %.o
    $(CC) $(LDFLAGS) $^ -o $@

%.o: %.c
    $(CC) $(OPT) $(CFLAGS) $^ -c -o $@

clean:
    rm -f $(PROGS) *.o

.PHONY: all clean
于 2012-10-11T02:51:39.443 に答える
0

ふぅ、

HTH

「$PWD で複数の main() ターゲットをビルドするための一般的な Makefile」

複数のCプログラムをコンパイルするためのMakefile?

于 2012-12-04T10:40:26.103 に答える