質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

Q&A

解決済

1回答

298閲覧

makefileの.oの流用の仕方

Horachan22

総合スコア1

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

0グッド

0クリップ

投稿2020/09/24 13:56

前提・実現したいこと

以下のようなビルドシステムを作成したのですが、.oに変化がない場合でもビルドするたびに.oの上書きがされており、非効率的なビルドシステムとなってしまいました。.oに変化がないとき、前に作られた*.oをそのまま使用するためにはどうしたらよいのでしょうか。

発生している問題・エラーメッセージ

該当のソースコード

makefile

1CC = g++ 2CFLAGS = -g -Wall 3OBJS = *.o 4TARGET = ABC 5 6%.o: src/%.cpp 7 @$(CC) $(CFLAGS) -o $@ -c $< 8 9ALL: $(OBJS) 10 @$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) 11 12%.o: src/%.hpp 13 14clean: 15 @rm -rf $(OBJS) $(TARGET) 16 17run: 18 @./$(TARGET) < $(TARGET) 19 20build_run: 21 @make 22 @make run 23

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/09/24 14:21

> *.oに変化がない場合でもビルドするたびに.oの上書きがされており、 これだと意味が通じないのですが、 「src/*.cppに変化が無い場合でもビルドするたびに.oの上書きがされており」の間違いでしょうか?
Horachan22

2020/09/24 14:35

文章が誤っていました。 そういう意味です。
hidezzz

2020/09/26 00:26

.oのほうは意図通り、.oが存在しないか.cppよりも古い場合に更新されるようになっていると思います。 意図どおりでないのは実行モジュールが.oの状態に関わらず必ず作られてしまうことのほうではないでしょうか? その他問題があるのでそのへんも含めて回答しました。
guest

回答1

0

ベストアンサー

疑問に対する直接の回答にはなっていないかもしれませんが、.cpp→.o→実行モジュールの依存関係でタイムスタンプを見てファイル更新がされるように修正してみました。

提示されているMakefileは、.oファイルがあるのが前提の書き方になっていますがcleanした後など.oファイルがないは状態では正しく動作しません。.oが存在しない状態で「*.o」や「%.o」としても.oファイルのリストは得たり、マッチングさせたりは出来ません。
.oのリストである$(OBJ)は.現在存在するcppファイルのリスト$(SRC)を取得してそこからから得るようにする必要があります。
また実行モジュールを作る規則のターゲットの指定(ALL)は$(TARGET)となるべきだと思います。意図通りに.oが流用されないというのはこれのことを言ってるのかもしれないと思いました。
デフォルトターゲットALLは慣習的には小文字のallとすることが多いと思うのでそのように修正しました。
runターゲットの意図や.hppの扱いが不明だったのですがとりあえずそのままにしてあります。
実行されるコマンドの確認のためにコマンド前の「@」は外してあります。
GNU Make 4.1で動作確認しています。

Makefile

1CC = g++ 2CFLAGS = -g -Wall 3SRCS = $(wildcard src/*.cpp) 4OBJS = $(patsubst src/%.cpp,%.o,$(SRCS)) 5TARGET = ABC 6 7all: $(TARGET) 8 9$(TARGET): $(OBJS) 10 $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) 11 12%.o: src/%.cpp 13 $(CC) $(CFLAGS) -o $@ -c $< 14 15%.o: src/%.hpp 16 17clean: 18 rm -rf $(OBJS) $(TARGET) 19 20run: 21 ./$(TARGET) < $(TARGET) 22 23build_run: 24 make 25 make run

実行モジュールと中間ファイルを削除してからビルド

terminal

1$ make clean 2$ ls -l `find . -type f` 3-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile 4-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp 5-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp 6$ make 7g++ -g -Wall -o hoge.o -c src/hoge.cpp 8g++ -g -Wall -o main.o -c src/main.cpp 9g++ -g -Wall -o ABC hoge.o main.o 10$ ls -l `find . -type f` 11-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:20 ./ABC 12-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile 13-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o 14-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o 15-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp 16-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp

実行モジュールを削除してからビルド

terminal

1$ rm ABC 2$ ls -l `find . -type f` 3-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile 4-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o 5-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o 6-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp 7-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp 8$ make 9g++ -g -Wall -o ABC hoge.o main.o 10$ ls -l `find . -type f` 11-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:22 ./ABC 12-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile 13-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o 14-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o 15-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp 16-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp

ソースのタイムスタンプを更新してからビルド

terimnal

1$ touch src/hoge.cpp 2$ ls -l `find . -type f` 3-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:22 ./ABC 4-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile 5-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o 6-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o 7-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:24 ./src/hoge.cpp 8-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp 9$ make 10g++ -g -Wall -o hoge.o -c src/hoge.cpp 11g++ -g -Wall -o ABC hoge.o main.o 12$ ls -l `find . -type f` 13-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:24 ./ABC 14-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile 15-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:24 ./hoge.o 16-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o 17-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:24 ./src/hoge.cpp 18-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp

投稿2020/09/26 00:01

編集2020/09/26 00:31
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Horachan22

2020/10/03 15:24

丁寧にご説明いただきありがとうございました。runターゲットは学習の一環として動作を確認するために行いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問