8

マクロを使用して複数のファイルから複数の実行可能ファイルを一度に作成するメイクファイルを作成しようとしています。以前に回答された質問を検索してみましたが、C でのプログラミングと gcc の操作にかなり慣れていないため、質問に対する回答を見つけることができませんでした。

これが私がこれまでに持っているものです:

CC=gcc
CFLAGS=-I.
OBJ = ex1.c ex3.c
EXECUTABLE = ex1 ex3

$(EXECUTABLE): $(OBJ)
    gcc -o $@ $^ $(CFLAGS)

clean:
    rm -f $(EXECUTABLE)

ラインをお願いします

$(EXECUTABLE): $(OBJ)

ファイル ex1.c ex3.c から実行可能ファイル ex1 と ex3 をそれぞれ作成します。

4

4 に答える 4

3

いくつかの提案 ( GNU makeを使用すると仮定し、他のものではありません)

まず、一度実行するとmake -p、組み込みのルールが認識していることを理解できますmakeCOMPILE.c特にとを探しますLINK.c

次に、私は提案します

 CFLAGS= -g -Wall -I.

(本当に-gデバッグが必要で、-Wallほとんどの警告が表示されるため)

そして、あなたはおそらく必要ありません

$(EXECUTABLE): $(OBJ)
    gcc -o $@ $^ $(CFLAGS)

ただし、他のほとんどのルールの前に追加することをお勧めします

.PHONY: all clean

all: $(EXECUTABLES)

実際、私はあなたのMakefileGNU makeの場合!)を次のようにコーディングします

# file Makefile
CC= gcc
RM= rm -vf
CFLAGS= -Wall -g
CPPFLAGS= -I.
SRCFILES= ex1.c ex2.c ## or perhaps $(wildcard *.c)
OBJFILES= $(patsubst %.c, %.o, $(SRCFILES))
PROGFILES= $(patsubst %.c, %, $(SRCFILES))

.PHONY: all clean

all: $(PROGFILES)
clean:
     $(RM) $(OBJFILES) $(PROGFILES) *~
## eof Makefile

は -s ( rulesのアクション部分)tabの重要な文字であることを忘れないでください。この回答では、少なくとも 4 つのスペースで始まる行は、実際には文字で始まる必要があります。Makefiletab

すべてがデバッグされたら、実行make cleanしてすべてをクリーンにし、次にmake -j CFLAGS=-O2 allすべてを最適化して並列にコンパイルすることを検討してください。

最後に、複雑な-sをデバッグするために使用remakeして実行することをお勧めしますremake -xMakefile

もちろん、あなたのディレクトリには単一ファイルのプログラムしかないと思います。

ところで、他のビルド自動化ツールがあります。おそらく、 omakeninja の使用を検討するかもしれません。大規模なプログラム (数百万のソース コード行) を構築する場合は、 automakeccachecmakeicecreamも検討してください。場合によっては、GPPGNU bisonSWIGなどで C コードを生成するか、独自のPythonまたはGuileスクリプト (または C メタプログラム) を使用することを検討してください。この草稿レポートも参照してください。

ソース ファイルには、gitなどのバージョン管理システムを使用することを忘れないでください。そのようなツールを学ぶ時でもあります。

于 2013-05-25T16:36:41.920 に答える
1

次の回答には、initiate、process1、process2、...、process4 などの複数の実行可能ファイルが含まれています。

LOCAL_INCLUDE=./

all: clean process_first process_second init

process_first:
    gcc -g -o process1  -I$(LOCAL_INCLUDE) process1.c  -lzmq  -L. -L./.
    gcc -g -o process2  -I$(LOCAL_INCLUDE) process2.c  -lzmq  -L. -L./.

process_second:
    gcc -g -o process3  -I$(LOCAL_INCLUDE) process3.c  -lzmq  -L. -L./.
    gcc -g -o process4  -I$(LOCAL_INCLUDE) process4.c  -lzmq  -L. -L./.

init:
    gcc -g -o initiate -I$(LOCAL_INCLUDE) initiate.c -lzmq -lconfig -lpthread -L. -L./. -ldl -lrt

clean:
    rm -rf init_manager.o init_manager
    rm -rf process1 process2 process3 process4

注: 再度作成する前に、すべての実行可能ファイルを消去して修正することをお勧めします。

于 2016-08-01T10:35:02.033 に答える
0

あなたは近いですが、パターンルールが必要です:

$(EXECUTABLE): % : %.c

そして、両方をビルドするためのデフォルトのルール:

all: $(EXECUTABLE)
于 2013-05-25T16:34:00.353 に答える