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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

974閲覧

Makefileの書き方について

AdultMr.

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/18 06:07

下記のようなフォルダ構成で、Makefileによって実行ファイルを生成したいと考えています。

├── Makefile ├── inc │ ├── sum.hpp │ └── sub.hpp └── src │ ├── sum.cpp │ ├── sub.cpp │ └── main.cpp └── obj

上記のフォルダ構成で、Makefileを実行したとき、下記のようにしたいと考えています。

├── Makefile ├── inc │ ├── sum.hpp │ └── sub.hpp └── src │ ├── sum.cpp │ ├── sub.cpp │ └── main.cpp └── obj │ ├── sum.o │ ├── sub.o │ └── main.o └── main

そこで下記のようなMakefileを書きました

Makefile

1CC = g++ 2CFLAGS = -O0 -g -Wall 3INCLUDE = -I./inc 4SRCS_BASES = main\ 5 sub\ 6 sum 7 8SRCDIR = ./src 9OBJDIR = ./obj 10TARGET = main 11 12SRCS = $(addprefix $(SRCDIR)/, $(addsuffix .cpp, $(SRCS_BASES))) 13OBJS = $(addprefix $(OBJDIR)/, $(addsuffix .o, $(SRCS_BASES))) 14 15$(TARGET): $(OBJS) 16 $(CC) -o $@ $^ 17 18$(OBJS): $(SRCS) 19 $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< 20 21ALL: clean $(TARGET) 22 23clean: 24 rm -f test ./obj/test.o ./obj/sub.o ./obj/sum.o

しかし、上記Makefileを実行すると、
g++ -O0 -g -Wall -I./inc -o obj/test.o -c src/test.cpp
g++ -O0 -g -Wall -I./inc -o obj/sub.o -c src/test.cpp
g++ -O0 -g -Wall -I./inc -o obj/sum.o -c src/test.cpp
g++ -o test obj/test.o obj/sub.o obj/sum.o

となってしまいます。
私としては、
g++ -O0 -g -Wall -I./inc -o obj/test.o -c src/test.cpp
g++ -O0 -g -Wall -I./inc -o obj/sub.o -c src/sub.cpp
g++ -O0 -g -Wall -I./inc -o obj/sum.o -c src/sum.cpp
g++ -o test obj/test.o obj/sub.o obj/sum.o
としたいです。
どのようにMakefileを修正すれば、私が望むような形になるのでしょうか…。
ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の修正でどうでしょうか?
本題ではありませんがcleanターゲットのところも指定がおかしかったのでそちらも修正しました。

Diff

1$ diff -u Makefile.old Makefile 2--- Makefile.old 2020-10-18 15:20:56.104874495 +0900 3+++ Makefile 2020-10-18 15:27:34.629452273 +0900 4@@ -15,10 +15,10 @@ 5 $(TARGET): $(OBJS) 6 $(CC) -o $@ $^ 7 8-$(OBJS): $(SRCS) 9+$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 10 $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< 11 12 ALL: clean $(TARGET) 13 14 clean: 15- rm -f test ./obj/test.o ./obj/sub.o ./obj/sum.o 16+ rm -f $(TARGET) $(OBJS)

#※コメントを受けて追記。

$(OBJS): $(SRCS)

obj/main.o obj/sub.o obj/sum.o: src/main.cpp src/sub.cpp src/sum.cpp

と展開されて、これは

obj/main.o: src/main.cpp src/sub.cpp src/sum.cpp obj/sub.o: src/main.cpp src/sub.cpp src/sum.cpp obj/sum.o: src/main.cpp src/sub.cpp src/sum.cpp

という依存関係を表します。

$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<

の「$<」は依存ファイルのうちの先頭の1つだけを表すのでどれもsrc/main.cppに展開されてしまいます。

本来の依存関係は、

obj/main.o: src/main.cpp obj/sub.o: src/sub.cpp obj/sum.o: src/sum.cpp

となるべきで、それをワイルドカードで短く書くことが出来るGNU makeの拡張機能で書いたものが、

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp

です。

投稿2020/10/18 06:22

編集2020/10/18 06:57
hidezzz

総合スコア1248

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

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

AdultMr.

2020/10/18 06:33

ありがとうございます! 無事に望む形で動作することが確認できました! なぜこのような形だと望む形になり、私が書いたMakefileだと動かないのか、勉強させていただきます…。
AdultMr.

2020/10/18 06:44

Makefileにおいて、%.o: %.cのように書くと、%には同じ名称のファイル名のものが代入されるようなイメージで正しいのでしょうか…? $(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< と記載すると、OBJDIR内の全てのobjファイルがそれぞれターゲットになり、SRCDIR内にある、同一名称のcppファイルのみが依存ファイルになっていると考えています。 そのため、上記のような印象を受けました…。 表現がうまくできず、申し訳ございません。
hidezzz

2020/10/18 06:49

入れ違いで回答に追記してしまいました。 追記で疑問が解決していなければまたコメントください。
AdultMr.

2020/10/18 07:10

詳細に教えていただき、大変ありがとうございます。 おかげさまで、内容の理解をすることができました。 丁寧な解説、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問