0

私はmakefilesに非常に慣れていません。私が以前に行った最も複雑なタスクは、すでに設計されたmakefileに新しい.hと.cppまたは.cを含めることでした。

プロジェクトのコンパイルプロセスをVisualStudioからgccに移植する必要があります。同僚が作成したソリューションはすでに作成されていますが、彼は4つのbashスクリプトとmakefileを使用してソリューションをコンパイルしました。

その代わりに、メンテナンスを容易にするソリューションを探していました。私の質問は非常に馬鹿げているかもしれませんが、どこにも見つからず、すべてを正しく理解することもできませんでした。

以下のターゲットでは:

$(OBJECTS): %.o: %.cpp 
    $(CC) $(CPPFLAGS) -c $< -o $@

作成中の.oが既に存在するかどうかをテストし、名前を別の名前に変更したいと思います。プロジェクトには同じ名前のソースファイルがいくつかありますが、内容が異なるため、これが必要です。

たとえば、コンパイル中の現在の.cppがfile.cppと呼ばれ、生成されるオブジェクトがfile.oである場合、ルールはfile.oが既に存在するかどうかをテストし、現在のfile.oの名前を別の名前に変更する必要があります。

これを説明する良いチュートリアルを知っているなら、私に知らせてください。そのルールによってコンパイルされている現在のファイルをテストする方法を示す例をたくさん見つけましたが、オブジェクトの名前を.oに変更する例はありませんでした。

事前に感謝し、ここに書かれた「愚かさ」をお詫びします。:-)

4

2 に答える 2

3

まず第一に、あなたは私たちの深い同情を持っています。

Makeは実際にはそのようなあいまいさを処理するように設計されていないため、応急修理を使用する必要があります。ファイルの名前をに変更する内容を指定していないので、今のところ、に移動するfile.oとしfile_save.oます。

# This tells Make that these are not real targets, so that it will
# proceed even if file.o already exists.
.PHONY: $(OBJECTS)

$(OBJECTS): %.o: %.cpp 
    # If file.o exists, move it to file_save.o
    @if [ -f $@ ]; then mv $@ $*_save.o; fi
    $(CC) $(CPPFLAGS) -c $< -o $@
于 2011-04-25T15:37:30.823 に答える
1

質問に対する私のコメントの拡張:

おそらく、名前の競合を防ぐために、オブジェクトファイルをソースファイルと同じディレクトリ階層に配置することを検討する必要があります。

そのため、src / network/client.cppはbuild/obj / network/client.oにコンパイルされます。

makefileに関しては非常に錆びていますが、次のようなことで解決したと思います。

$SRC= src/network/client.cpp src/main.cpp .....
$OBJ= makefile_replace_function($SRC, .o)

$(OBJ) : $(SRC)
   compile_instructions

私がその時忘れていたので、あなたがそれらの本当の同等物makefile_replace_functionに取り替えなければならないところ...compile_instructions

これはあまり役に立たないかもしれませんが、少なくとも検討すべきアイデアだと思います。

于 2011-04-27T12:46:22.017 に答える