-1

次の 3 つのファイルがあります。MyLib.h MyLib.c Tester.c メイクファイルを作成しようとしましたが、難しいことがわかりました。

Hello.cをコンパイルしている以下のように、ファイルが1つだけの場合に実行できます

いくつかの例を見てきましたが、以下で使用しているものよりもはるかに複雑に思えます。

BINDIR =    /usr/local/sbin
CC =        gcc
CFLAGS =    -O

all:        Hello

Hello:  Hello.o
    ${CC} ${CFLAGS} Hello.o ${LDFLAGS} -o Hello


Hello.o:    Hello.c
    ${CC} ${CFLAGS} -c Hello.c


install:    all
    rm -f ${BINDIR}/Hello
    cp Hello ${BINDIR}/Hello



clean:
    rm -f Hello  *.o core core.* *.core

助けてください。

コンピューターの電源を入れるたびにこれを入力していましたが、今ではちょっと面倒です。

gcc MyLib.c Tester.c -o Tester
4

2 に答える 2

0

粗雑だが効果的:

Tester:
    gcc MyLib.c Tester.c -o Tester

より良い:

CC = gcc

Tester: MyLib.o Tester.o
    $(CC) $^ -o $@

そして、依存関係について推測します。

MyLib.o Tester.o : MyLib.h

より洗練された makefile も可能ですが、今のところはこれで十分です。

于 2013-09-22T22:33:30.893 に答える
0

両方の C ファイルの依存関係であると仮定MyLib.hすると、次のようなものが必要です。

# Variables

CC := gcc
CFLAGS := -O


# Link executable

Tester: MyLib.o Tester.o
    ${CC} MyLib.o Tester.o ${LDFLAGS} -o Tester


# Compile object files

MyLib.o: MyLib.c MyLib.h
    ${CC} ${CFLAGS} -c -o MyLib.o MyLib.c

Tester.o: Tester.c MyLib.h
    ${CC} ${CFLAGS} -c -o Tester.o Tester.c

そして、物事がどのように機能するかを理解したら、コードの重複を減らすための 2 番目のステップとして自動変数を使用できます。

# Variables

CC := gcc
CFLAGS := -O


# Link executable

Tester: MyLib.o Tester.o
    ${CC} $^ ${LDFLAGS} -o $@


# Compile object files

MyLib.o: MyLib.c MyLib.h
    ${CC} ${CFLAGS} -c -o $@ $<

Tester.o: Tester.c MyLib.h
    ${CC} ${CFLAGS} -c -o $@ $<

ここ$@で、 は現在のルールのターゲットの名前に$<置き換えられ、最初 (つまり、一番左) の依存関係に$^置き換えられ、依存関係の完全なリストに置き換えられます。

上記では、 の後のビットは依存関係です。つまり、依存関係のいずれかがターゲットよりも新しい場合、:の左側のターゲットが作成/再作成されます。:依存関係ごとに、そのmakeターゲットを探します。したがって、最初のセクションでは、MyLib.oおよびTester.oが実行可能ファイル全体の依存関係であることがわかり、提供されているそれらのターゲットを探します。ターゲットを見つけると、それらをビルドし (必要な場合)、ビルドに進みTesterます。

CFLAGS慣習的にコンパイルフラグを表すことに注意してください。したがって、その時点ではコンパイルが行われていないため、リンクのみを行っている場合はそれらを渡す必要はありません。

また、この種のことに苦労している場合は、何が起こっているのかを理解するまで、単純化してすべての追加ターゲット (cleanおよびinstallおよび など) を削除してください。all

于 2013-09-22T22:50:36.047 に答える