0

Linuxで現在のディレクトリにあるプロジェクトをビルドするために使用したい次のMakefileがserial.cありますが、これは内部からC ++ライブラリを使用し、ディレクトリにビルドする必要があり、srcすべてのファイルを明確に分離します。includeobj

#define some paths
DHOME      = ${HOME}/Serial
SRC        = ${DHOME}/src
INCLUDE    = ${DHOME}/include
BIN        = ${DHOME}/bin
OBJ        = ${DHOME}/obj

# compiler
CFLAGS        = -I$(INCLUDE)
CXX           = g++ -g ${INCLUDE} 
MAKE          = ${CXX} -O -Wall -fPIC -c

$(OBJ)/%.o: $(SRC)/%.cc
    $(MAKE) $(CFLAGS) $< -o ${OBJ}/$@ 

serial: $(OBJ)/%.o
    ${CXX} -o $@ $@.c $< $(CFLAGS) 


.PHONY: clean
clean:
    @rm -f serial $(OBJ)/*.o

試したときのエラーメッセージmake serialまたはmake

make: *** No rule to make target `/home/alex/Serial/obj/%.o', needed by `serial'.  Stop.

しかし、Makefileを見ると、このルール(ルールの上のserialルール)を指定したようです。私はおそらく基本的な何かを逃しました。たぶん、そのようなプロジェクトを処理し、ディレクトリ内で異なる部分を明確に分離するためのより良い方法がありますか?

ありがとう、アレックス

4

2 に答える 2

2

問題はあなたのルールです:

serial: $(OBJ)/%.o

このルールの TARGETには no がないため%、これはパターン ルールではありません。/home/alex/Serial/obj/%.oそのため、存在せず、作成できない (文字通り)という名前のファイルを探します。

serial実際のオブジェクト ファイル名のリストに依存する必要があります。次に、パターンルール $(OBJ)/%.o: $(SRC)/%.ccはそれらのそれぞれに一致し、コンパイルに使用されます。

編集

そのリストを自動的に生成したい場合は、ソースファイルで glob ルールを使用してから、パターン置換を使用してオブジェクト ファイルを生成できます。

SOURCES = $(wildcard $(SRC)/*.cc)
OBJECTS = $(SOURCES:$(SRC)/%.cc=$(OBJ)/%.o)
于 2012-09-27T16:57:27.860 に答える
0

パターン マッチング ルールはターゲットに作用します。

ビルドするターゲットのリストを指定しないため、パターン マッチングは想定どおりに機能しません。

パターン マッチングは、コマンド ラインでワイルドカードとして機能するように構築されていません。ターゲットを探すように make に要求することはできません。ターゲットを指定する必要があります。

serialそのため、特定のファイルに依存している場合は.o、これらを提供する必要があります。これを行う最も簡単な方法は、ルールを書き直すことです。

serial: $(OBJ)/foo.o $(OBJ)/bar.o $(OBJ)/fie.o
    #Insert build command here, as needed

serialこれにより、各オブジェクト ファイルがリンクされる前にターゲットとして設定されるため、パターン マッチングがトリガーされます。

于 2012-09-27T16:56:58.910 に答える