1

LinuxでCで書いた小規模アプリケーション用のmakefileを書き込もうとしています。現在、すべてのソースファイル.cはトップレベルディレクトリにあり、すべてのヘッダーファイルはインクルードディレクトリにあります。これが私がこれに使用したmakefileです。

IDIR =include
CC=gcc
CFLAGS=-I$(IDIR)


ODIR=obj

_OBJ = main.o kernel.o user_app.o myargs.o ofp_msgs.o pkt_ip.o pkt_ether.o pkt_tcp.o pkt_udp.o pkt_icmp.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

#DEPS = ofp_msgs.h




$(ODIR)/%.o: %.c 
    $(CC) -c -o $@ $< $(CFLAGS)            
all: jam

jam: $(OBJ)
    gcc -o $@ $^ $(CFLAGS)  -lpthread

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ jam 

正常に動作しますが、たとえば、サブディレクトリを作成し、"Packet"すべてのパケット解析ファイル"pkt_ip.c, pkt_tcp.c etc"をそのディレクトリに配置する必要がありますが、ヘッダーファイルは引き続き最上位ディレクトリに配置する必要があります"toplevel/include"。私は少し検索を行いましたが、最も一般的な方法は再帰的なmakeを使用することでした。それから私は再帰的なmakeについて不平を言う多くのページを見ます。誰かがこれを正しく行う方法としてこれで私を助けてくれますか?ありがとう

4

2 に答える 2

3

Recursive MakeThoughdHarmfulで説明されている方法を確認することをお勧めします。私はこれをいくつかのプロジェクト(中小規模)で使用しましたが、再帰的なアプローチよりも使いやすく、頭を包み込むのが簡単であることがわかりました。

基本的に、ルートディレクトリにMakefileがあり、各サブディレクトリからの(部分的な)makefileが含まれています。

SRC := main.c
MODULES := Packet lib etc
-include $(patsubst %, %/module.mk, $(MODULES))

OBJ := $(patsubst %.c, %.o, $(filter %.c,$(SRC)))
# (...)

Packet / module.mk:

SRC += Packet/pkt_ip.c Packet/pkt_tcp.c
LIBS += -lsome_library

もちろん、これらのモジュールmakefileは、独自のモジュールターゲット、または特別なビルド要件を定義することもできます。

再帰的なmakeとは異なり、「make」は1回だけ呼び出されます。これにより、ほとんどのユースケースでビルドが高速化されます。ただし、ほとんどの小規模なプロジェクトでは、ビルド時間も複雑さも大きな問題にはならないため、最も自然に感じられるものを使用してください。

于 2012-04-17T12:03:07.767 に答える
2

これを行うにはいくつかの方法がありますが、VPATH:=Packetmakeに「Packet」ディレクトリ内のソースファイルを探すように指示するために使用できます。マニュアルを参照してください

于 2012-04-17T11:15:17.260 に答える