2016-11-12 8 views
0

に依存します(悪い英語のため申し訳ありませんが、私はドイツ語だ)GNUオート依存関係がディレクトリ

こんにちはプログラマ、

私はGNUが私のC++プロジェクトのために作る使用していますが、私はといくつかの問題があることを確認してくださいauto/dependencies: "make objects/file.o"を実行すると、source/file.cppに含まれるファイルが変更された場合でも、objects/file.oはすでに最新であることがわかります。 奇妙なことは、DEP_DIRとOBJ_DIRを "。"に変更した場合です。すべてが機能する。ここ は(不完全)私のメイクです:

SRC_DIR := source 
DEP_DIR := dependencies 
OBJ_DIR := objects 

$(shell mkdir -p $(dir EXE_PATH)) 

-include $(addprefix $(DEP_DIR)/, $(NAMES:=.d)) 

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp 
     $(CXX) -c $(CFLAGS) $(SRC_DIR)/$*.cpp -o [email protected] 
     $(CXX) -MM $(CFLAGS) $^ > $(DEP_DIR)/$*.d 

$(EXE_PATH) : $(addprefix $(OBJ_DIR)/, $(NAMES:=.o)) 
     $(CXX) $(LINK_FLAGS) $^ -o $(EXE_PATH) 

all : $(EXE_PATH) 

run : 
     $(EXE_PATH) 

carun : $(EXE_PATH) 
     $(EXE_PATH) 

clean: 
     rm -f EXE_PATH 

誰も私にこの奇妙な問題を説明することができれば、私は感謝するでしょう。

+0

「CPP」ではなく「CXX」である必要があります。 'CPP'はCプリプロセッサ、' CXX'はC++コンパイラ – igagis

+0

そうでなければ、https://github.com/igagis/prorab/blob/master/wiki/TutorialBasicConcepts.mdを使うことをお勧めしますあなたとあなたはそれについて心配する必要はありません。 – igagis

答えて

0

これは現在依存関係の生成がどのように行われているかではなく、コンパイルのside effectとして依存関係を生成できます。また、組み込みの変数名CXX,CPPFLAGSCXXFLAGSLDFLAGSLDLIBSを使用し、makeの組み込みレシピをリサイクルします。

.PHONY: all 
all: Release/$(EXE_NAME) 
    echo "finished building... in theory" 

Release/$(EXE_NAME): CC := $(CXX) 
Release/$(EXE_NAME): $(OBJS) | Release 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

$(objDir)/%.o: CPPFLAGS += -MMD -MP 
$(objDir)/%.o: $(srcPath)/%.cpp | $(objDir) 
    $(COMPILE.cpp) $(OUTPUT_OPTION) $< 

$(objDir) Release: ; mkdir -p [email protected] 

-include $(OBJS:.o=.d) 
1

あなたが見ているエラーについての質問に答えるために:メイクファイルが解析されるように、ターゲットや前提条件のリストに表示されたマクロや関数は、makeはパターンに一致したルールを実行するために開始し、長い前に、すぐに展開され%を交換してください。だから、この行に:makeがmakefileの中で読んでいる間、

$(depDir)/%.d : $(srcPath)/%.cpp $(shell cat $(depDir)/%.d) 

shell関数が呼び出され、その時点でそれだけで何のパターンマッチングがまだ起こっていないので、逐語的文字列%.dを使用します。

これは自動依存性の生成を行う正しい方法ではありません(これらのファイルがどのように生成されるかを実際には示していないため、具体的なアドバイスは難しい)。

もっと現代的で効率的な方法を知りたい場合は、this blog postをご覧ください。