12

私は本当にメイクファイルに入ることができません。以前のプロジェクトでは、すべてのコンパイル タスクをMakefileにハードコーディングしました。

all: compile_a compile_b compile_c

compile_a:
    ${CC} ${CFLAGS} ${A_SRC} -o ${A_OUT}

等々。

しかし、最新のプロジェクトは以前のどのプロジェクトよりも多くのファイルを持っているので、より良い make タスクを書きたいと思っています。:-P

私が欲しいもの:

  • それらすべてを支配する 1 つのタスク (単にmake projectnameまたはmake all、ご存知ですか?)
  • すべての C ファイルをコンパイルするための 1 つのタスク (この構文について何か読んだこと%.o: %.cがありますが、実際にはわかりませんでした)
  • リンクのための 1 つのタスク (すべての .o ファイルを取得し、それぞれをハードコーディングせずにリンクする方法は?)
  • 掃除のタスクが 1 つ (ああ、私はこれを行うことができます!)

プロジェクトの構造は次のとおりです。

bin (binary goes here!)
src
  some
  directories 
  are
  here

オブジェクト ファイル用のディレクトリが必要かどうかわかりませんが、./bin.

簡単な言葉で説明できる人が必要なのかもしれません。

編集:誰かが指摘したように、本当の質問はないので、ここに行きます:

  • すべての C ファイルを再帰的にコンパイルする方法bin/(filename).o
  • .o名前を知らずに「bin /」内のすべてのファイルをリンクする方法

たぶんこれが役立ちます。

4

3 に答える 3

11

これを試して:

CC = gcc
CFLAGS = -c -Wall -g -Os
LD = $(CC)
LDFLAGS = -lfoo

TARGET = MyProject

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))

all: $(TARGET)

$(TARGET): $(OBJECTS)
        $(LD) -o $@ $^ $(LDFLAGS)

# You don't even need to be explicit here,
# compiling C files is handled automagically by Make.
%.o: %.c
        $(CC) $(CFLAGS) $^ -o $@

clean:
        rm $(TARGET) $(OBJECTS)
于 2013-01-29T18:31:57.080 に答える
7

私はよくあなたが達成したいような何かのためwildcardに機能と組み合わせて機能を使用します。foreach

ソースが入っていて、バイナリを私の基本的な構造にsrc/入れたい場合は、次のようになります。bin/Makefile

SOURCES=$(shell find src -type f -iname '*.c')

OBJECTS=$(foreach x, $(basename $(SOURCES)), $(x).o)

TARGET=bin/MyProject

$(TARGET): $(OBJECTS)
    $(CC) $^ -o $@

clean:
    rm -f $(TARGET) $(OBJECTS)

私は通常、makeに組み込まれている暗黙のルールと事前定義された変数を利用します(Makeマニュアル、第10章)。

于 2013-01-29T18:58:21.013 に答える
-5

makefile の詳細には立ち入らずに、* を有利に使用してください。

すなわち

compileAll:    gcc -c *.c
linkAll:       gcc *.o -o output.exe
于 2013-01-29T18:31:04.120 に答える