2011-07-04 16 views
1

私はちょうどmakefileを使い始めています。私は2つのターゲットを持つ私のプロジェクトのために1つを書いています。私が新しいものを作ったら、すべてがうまくいく。しかし、その後、私がそれをきれいにしておかないと、1つのソースファイルを編集して保存した後、もう一度makeを実行すると、私のプロジェクトは編集したソースファイルをコンパイルし、ソースを新しい実行可能ファイル。なぜ私のプロジェクトはクリーニングせずにリンクされませんか?

他の言葉:私が初めて実行すると、それぞれのソースに対して$(CC) -c <sourcefile>が得られ、次に$(CC) -o <sourceobject1> <sourceobject2>...となり、すべて動作します。しかし、私がソースファイルを編集して再作成しようとすると、私はちょうど$(CC) -c <editedsourcefile>を得て、その後はリンクしません!少なくともmakeはすべてのソースファイルをもう一度コンパイルしようとはしていませんが、なぜ私に新しい実行ファイルをリンクしていないのですか?これは期待される行動ですか?

ボーナスの質問:対象のルールの上部にmv *.oを貼るよりも、オブジェクトファイルをサブディレクトリに移動する方がいいですか?私はthis answerを見ましたが、何が起こっているのか分からず、2つのターゲットを使って自分のケースに合わせる方法を理解できませんでした。ここで

は私のメイクです:

CC = clang++ 
OPTFLAGS = -O3 -flto -m64 
CFLAGS = -Wall -c $(OPTFLAGS) 
LFLAGS = -Wall $(OPTFLAGS) 
MAKE = make 
RM = \rm -f 
TARGET-DIR = build 
OBJ-DIR = $(TARGET-DIR)/obj 
OBJS = $(addprefix $(OBJ-DIR)/, MCTS.o NodePool.o Node.o FastMath.o \ 
     Board.o Patterns.o FastSet.o FastHash.o FastHash2.o FastHashMap.o) 
GTP-OBJS = $(addprefix $(OBJ-DIR)/, GtpPlayer.o) 
GTP-TARGET = $(TARGET-DIR)/go-gtp 
TEST-OBJS = $(addprefix $(OBJ-DIR)/, TestsMain.o MCTSTests.o NodePoolTests.o \ 
     NodeTests.o FastMathTests.o BoardTests.o FastSetTests.o \ 
     FastHashTests.o FastHash2Tests.o FastHashMapTests.o) 
TEST-TARGET = $(TARGET-DIR)/go-test 

.PHONY : all 
all : $(GTP-TARGET) $(TEST-TARGET) 

$(GTP-TARGET) : $(GTP-OBJS) $(OBJS) 
    mv *.o $(OBJ-DIR) 
    $(CC) $(LFLAGS) $(GTP-OBJS) $(OBJS) -o $(GTP-TARGET) 

$(OBJ-DIR)/GtpPlayer.o : GtpPlayer.hpp GtpPlayer.cpp mcts/MCTS.hpp 
    $(CC) $(CFLAGS) GtpPlayer.cpp 

$(OBJ-DIR)/MCTS.o : mcts/MCTS.hpp mcts/MCTS.cpp mcts/NodePool.hpp 
    $(CC) $(CFLAGS) mcts/MCTS.cpp 

$(OBJ-DIR)/NodePool.o : mcts/NodePool.hpp mcts/NodePool.cpp mcts/Node.hpp 
    $(CC) $(CFLAGS) mcts/NodePool.cpp 

$(OBJ-DIR)/Node.o : mcts/Node.hpp mcts/Node.cpp mcts/FastMath.hpp board/Board.hpp 
    $(CC) $(CFLAGS) mcts/Node.cpp 

$(OBJ-DIR)/FastMath.o : mcts/FastMath.hpp mcts/FastMath.cpp 
    $(CC) $(CFLAGS) mcts/FastMath.cpp 

$(OBJ-DIR)/Board.o : board/Board.hpp board/Board.cpp board/Patterns.hpp struct/FastSet.hpp struct/FastHash.hpp 
    $(CC) $(CFLAGS) board/Board.cpp 

$(OBJ-DIR)/Patterns.o : board/Patterns.hpp board/Patterns.cpp struct/FastHash2.hpp struct/FastHashMap.hpp 
    $(CC) $(CFLAGS) board/Patterns.cpp 

$(OBJ-DIR)/FastSet.o : struct/FastSet.hpp struct/FastSet.cpp 
    $(CC) $(CFLAGS) struct/FastSet.cpp 

$(OBJ-DIR)/FastHash.o : struct/FastHash.hpp struct/FastHash.cpp 
    $(CC) $(CFLAGS) struct/FastHash.cpp 

$(OBJ-DIR)/FastHash2.o : struct/FastHash2.hpp struct/FastHash2.cpp 
    $(CC) $(CFLAGS) struct/FastHash2.cpp 

$(OBJ-DIR)/FastHashMap.o : struct/FastHashMap.hpp struct/FastHashMap.cpp 
    $(CC) $(CFLAGS) struct/FastHashMap.cpp 

$(TEST-TARGET) : $(TEST-OBJS) $(OBJS) 
    mv *.o $(OBJ-DIR) 
    $(CC) $(LFLAGS) $(TEST-OBJS) $(OBJS) -o $(TEST-TARGET) 

$(OBJ-DIR)/TestsMain.o : test/TestsMain.cpp test/MCTSTests.hpp test/NodePoolTests.hpp \ 
      test/NodeTests.hpp test/FastMathTests.hpp test/BoardTests.hpp \ 
      test/FastSetTests.hpp test/FastHashTests.hpp test/FastHash2Tests.hpp test/FastHashMapTests.hpp 
    $(CC) $(CFLAGS) test/TestsMain.cpp 

$(OBJ-DIR)/MCTSTests.o : test/MCTSTests.hpp test/MCTSTests.cpp mcts/MCTS.hpp 
    $(CC) $(CFLAGS) test/MCTSTests.cpp 

$(OBJ-DIR)/NodePoolTests.o : test/NodePoolTests.hpp test/NodePoolTests.cpp 
    $(CC) $(CFLAGS) test/NodePoolTests.cpp 

$(OBJ-DIR)/NodeTests.o : test/NodeTests.hpp test/NodeTests.cpp 
    $(CC) $(CFLAGS) test/NodeTests.cpp 

$(OBJ-DIR)/FastMathTests.o : test/FastMathTests.hpp test/FastMathTests.cpp 
    $(CC) $(CFLAGS) test/FastMathTests.cpp 

$(OBJ-DIR)/BoardTests.o : test/BoardTests.hpp test/BoardTests.cpp 
    $(CC) $(CFLAGS) test/BoardTests.cpp 

$(OBJ-DIR)/FastSetTests.o : test/FastSetTests.hpp test/FastSetTests.cpp 
    $(CC) $(CFLAGS) test/FastSetTests.cpp 

$(OBJ-DIR)/FastHashTests.o : test/FastHashTests.hpp test/FastHashTests.cpp 
    $(CC) $(CFLAGS) test/FastHashTests.cpp 

$(OBJ-DIR)/FastHash2Tests.o : test/FastHash2Tests.hpp test/FastHash2Tests.cpp 
    $(CC) $(CFLAGS) test/FastHash2Tests.cpp 

$(OBJ-DIR)/FastHashMapTests.o : test/FastHashMapTests.hpp test/FastHashMapTests.cpp 
    $(CC) $(CFLAGS) test/FastHashMapTests.cpp 

.PHONY : clean 
clean : 
    $(RM) $(OBJ-DIR)/*.o 

.PHONY : distclean 
distclean : 
    $(MAKE) clean 
    $(RM) $(GTP-TARGET) $(TEST-TARGET) 

.PHONY : again 
again: 
    $(MAKE) distclean 
    $(MAKE) $(GTP-TARGET) 
    $(MAKE) $(TEST-TARGET) 

.PHONY : tar 
tar: 
    tar cfv $(GTP-TARGET).tar $(GTP-OBJS) $(OBJS) 
    tar cfv $(TEST-TARGET).tar $(TEST-OBJS) $(OBJS) 

出力例:私が編集して保存Board.cppを例えばmakeを再度実行する場合

$ make 
clang++ -Wall -c -O3 -flto -m64 GtpPlayer.cpp 
clang++ -Wall -c -O3 -flto -m64 mcts/MCTS.cpp 
clang++ -Wall -c -O3 -flto -m64 mcts/NodePool.cpp 
clang++ -Wall -c -O3 -flto -m64 mcts/Node.cpp 
clang++ -Wall -c -O3 -flto -m64 mcts/FastMath.cpp 
clang++ -Wall -c -O3 -flto -m64 board/Board.cpp 
clang++ -Wall -c -O3 -flto -m64 board/Patterns.cpp 
clang++ -Wall -c -O3 -flto -m64 struct/FastSet.cpp 
clang++ -Wall -c -O3 -flto -m64 struct/FastHash.cpp 
clang++ -Wall -c -O3 -flto -m64 struct/FastHash2.cpp 
clang++ -Wall -c -O3 -flto -m64 struct/FastHashMap.cpp 
mv *.o build/obj 
clang++ -Wall -O3 -flto -m64 build/obj/GtpPlayer.o build/obj/MCTS.o build/obj/NodePool.o build/obj/Node.o build/obj/FastMath.o build/obj/Board.o build/obj/Patterns.o build/obj/FastSet.o build/obj/FastHash.o build/obj/FastHash2.o build/obj/FastHashMap.o -o build/go-gtp 
clang++ -Wall -c -O3 -flto -m64 test/TestsMain.cpp 
clang++ -Wall -c -O3 -flto -m64 test/MCTSTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/NodePoolTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/NodeTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/FastMathTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/BoardTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/FastSetTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/FastHashTests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/FastHash2Tests.cpp 
clang++ -Wall -c -O3 -flto -m64 test/FastHashMapTests.cpp 
mv *.o build/obj 
clang++ -Wall -O3 -flto -m64 build/obj/TestsMain.o build/obj/MCTSTests.o build/obj/NodePoolTests.o build/obj/NodeTests.o build/obj/FastMathTests.o build/obj/BoardTests.o build/obj/FastSetTests.o build/obj/FastHashTests.o build/obj/FastHash2Tests.o build/obj/FastHashMapTests.o build/obj/MCTS.o build/obj/NodePool.o build/obj/Node.o build/obj/FastMath.o build/obj/Board.o build/obj/Patterns.o build/obj/FastSet.o build/obj/FastHash.o build/obj/FastHash2.o build/obj/FastHashMap.o -o build/go-test 

は今、私はこれを取得:

$ make 
clang++ -Wall -c -O3 -flto -m64 board/Board.cpp 

リンクコマンドはどうなりましたか?私は新しい目標が欲しい!

+4

は、なぜあなたは周り '* .o'ファイルを移動していますか?あなたはその移動せずにあなたのmakefileを試してみたらどうですか? (明らかに、動作させるためにはいくつかの変更が必要です。)これは事実上、非標準的な方法です。私が "私の' .o'ファイルをどこか別の場所に置いて欲しいと思っていた解決策は、コンパイラにmakefile(makeを混乱させる)に動かすのではなく、直接その場所で生成するように伝えます。 –

+1

関連はありませんが、ほとんどのルールを '$(OBJ_DIR)/%。0:test /%。hpp test /%。cpp'に簡略化することができます。 – Maxpm

+1

'-o $ @'をコンパイラコマンドに追加すると、オブジェクトディレクトリ( '$(OBJ-DIR)/ FastHash2.o')で自動的にオブジェクトディレクトリにオブジェクトが出力されます。それはあなたに余分なトラブルを与えていると思う 'mv'コマンドを削除させます。リンカーの問題を解決する方法は完全にはわかりませんが、Makefile全体を移動して依存関係のみを一覧表示すると、それを簡単に見つけることができます。 – sarnold

答えて

2

新しいobjファイルはOBJ_DIRにありませんが、移動前のどこにあっても(現在のディレクトリ?)、リンクされません。実行可能ファイルとオブジェクトファイルを見て、実行ファイルがOBJ_DIRのオブジェクトファイルよりも新しいと正しく判断します。

コンパイラはOBJ_DIRで最初に(-oを使用して)コンパイラに生成させるか、またはオブジェクトファイルを生成する各ルール(推奨しません)にmvコマンドを移動して、ルール実行後にobjファイルをOBJ_DIRが更新されます。

+0

私の方法が失敗した理由を正確に説明してくれてありがとう。私は単に、私が望むディレクトリにオブジェクトファイルを出力するコマンドを知らなかった。 – Imran

1

私のオブジェクトファイルを$(CC)-o $ @で目的のディレクトリに出力します(そして、私のターゲットルールでmv * .oコマンドを削除する)ことで私の問題は解決します。すべてが期待どおりにリンクしています。

コメントの中でこれを行う方法を説明したGregsarnoldのおかげで、

私のメイクファイルは、次のようになります。

CC = clang++ 
CFLAGS = -Wall -O3 -flto -m64 
MAKE = make 
RM = \rm -f 
TARGET-DIR = build 
OBJ-DIR = $(TARGET-DIR)/obj 
OBJS = $(addprefix $(OBJ-DIR)/, MCTS.o NodePool.o Node.o FastMath.o \ 
     Board.o Patterns.o FastSet.o FastHash.o FastHash2.o FastHashMap.o) 
GTP-OBJS = $(addprefix $(OBJ-DIR)/, GtpPlayer.o) 
GTP-TARGET = $(TARGET-DIR)/go-gtp 
TEST-OBJS = $(addprefix $(OBJ-DIR)/, TestsMain.o MCTSTests.o NodePoolTests.o \ 
     NodeTests.o FastMathTests.o BoardTests.o FastSetTests.o \ 
     FastHashTests.o FastHash2Tests.o FastHashMapTests.o) 
TEST-TARGET = $(TARGET-DIR)/go-test 

.PHONY : all 
all : $(GTP-TARGET) $(TEST-TARGET) 

$(GTP-TARGET) : $(GTP-OBJS) $(OBJS) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

$(OBJ-DIR)/GtpPlayer.o : GtpPlayer.cpp 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

$(OBJ-DIR)/%.o : mcts/%.cpp 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

$(OBJ-DIR)/%.o : board/%.cpp 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

$(OBJ-DIR)/%.o : struct/%.cpp 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

$(TEST-TARGET) : $(TEST-OBJS) $(OBJS) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

$(OBJ-DIR)/%.o : test/%.cpp 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

.PHONY : clean 
clean : 
    $(RM) $(OBJ-DIR)/*.o 

.PHONY : distclean 
distclean : 
    $(MAKE) clean 
    $(RM) $(GTP-TARGET) $(TEST-TARGET) 

.PHONY : again 
again: 
    $(MAKE) distclean 
    $(MAKE) $(GTP-TARGET) 
    $(MAKE) $(TEST-TARGET) 

.PHONY : tar 
tar: 
    tar cfv $(GTP-TARGET).tar $(GTP-OBJS) $(OBJS) 
    tar cfv $(TEST-TARGET).tar $(TEST-OBJS) $(OBJS) 
関連する問題