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

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

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

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

C++

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

Q&A

解決済

2回答

1687閲覧

makeコマンド実行時に意図しないコンパイルが実行されてしまう

fujioka_cpp

総合スコア1

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

makefile

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

C++

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

0グッド

0クリップ

投稿2020/07/27 14:16

編集2020/07/27 14:18

前提・実現したいこと

####前提

  • 自作のリスト構造クラスを利用したスタック構造クラスの実装中。
  • テストフレームワークとしてgoogletestを採用した。
  • makeコマンドを利用し**"コーディング→オブジェクトファイルコンパイル→テストプログラムコンパイル→テストプログラム実行"**を自動化することを目論んだ。
  • しかしながら、テストプログラム実行後に意図しないコンパイルが実行されてしまう

####実現したいこと
下記の意図しないコンパイルを実行させたくない。

発生している問題

text

1エラーメッセージ 2~/Workspace/Training/SRC $: make clean 3rm ../TMP/*.o 4rm ../EXEC/*.out 5~/Workspace/Training/SRC $: make 6g++ -std=c++17 -Wall -c ./stack_list.cpp -o ../TMP/stack_list.o 7g++ -std=c++17 -Wall -c ./Util/DoubleList.cpp -o ../TMP/DoubleList.o 8g++ -std=c++17 -Wall -DLIST ../TEST/test_stack.cpp ../TMP/stack_list.o ../TMP/DoubleList.o -o ../EXEC/test_stack_list.out -lgtest -lgtest_main 9make test_stack_list 10../EXEC/test_stack_list.out 11[==========] Running 4 tests from 1 test suite. 12[----------] Global test environment set-up. 13[----------] 4 tests from StackTest 14[ RUN ] StackTest.test_size 15[ OK ] StackTest.test_size (0 ms) 16[ RUN ] StackTest.test_push 17[ OK ] StackTest.test_push (0 ms) 18[ RUN ] StackTest.test_get 19[ OK ] StackTest.test_get (0 ms) 20[ RUN ] StackTest.test_pop 21[ OK ] StackTest.test_pop (0 ms) 22[----------] 4 tests from StackTest (0 ms total) 23 24[----------] Global test environment tear-down 25[==========] 4 tests from 1 test suite ran. (0 ms total) 26[ PASSED ] 4 tests. 27/*******ここでmakeコマンドを終了することを期待していたが、以下のコンパイルが実行される*******/ 28c++ stack_list.cpp ../EXEC/test_stack_list.out -o stack_list 29In file included from stack_list.cpp:1: 30In file included from ./stack.hpp:2: 31./Util/List.hpp:34:25: warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] 32 unsigned int m_size = 0; 33〜〜〜c++11が指定されていないことによる多数のwarning〜〜〜 34stack_list.cpp:4:14: warning: alias declarations are a C++11 extension [-Wc++11-extensions] 35using uint = unsigned int; 36 ^ 37stack_list.cpp:25:5: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] 38 auto result = m_list.remove(m_list.get_size() - 1); 39 ^ 408 warnings generated. 41ld: can't link with a main executable file '../EXEC/test_stack_list.out' for architecture x86_64 42clang: error: linker command failed with exit code 1 (use -v to see invocation) 43make: *** [stack_list] Error 1 44

該当のソースコード

Makefile

1COMPILER = g++ 2FLAGS = -std=c++17 -Wall 3TEST_LIBS = -lgtest -lgtest_main 4SRC_DIR = . 5UTIL_DIR = ./Util 6TMP_DIR = ../TMP 7EXEC_DIR = ../EXEC 8TEST_DIR = ../TEST 9 10#StackList 11stack_list: $(EXEC_DIR)/test_stack_list.out 12## オブジェクトファイル生成 13comp_stack_list: $(TMP_DIR)/stack_list.o $(TMP_DIR)/DoubleList.o 14$(TMP_DIR)/stack_list.o: $(SRC_DIR)/stack_list.cpp 15 $(COMPILER) $(FLAGS) -c $(SRC_DIR)/stack_list.cpp -o $(TMP_DIR)/stack_list.o 16$(TMP_DIR)/DoubleList.o: $(UTIL_DIR)/DoubleList.cpp 17 $(COMPILER) $(FLAGS) -c $(UTIL_DIR)/DoubleList.cpp -o $(TMP_DIR)/DoubleList.o 18 19## テストコンパイル 20$(EXEC_DIR)/test_stack_list.out: $(TEST_DIR)/test_stack.cpp $(TMP_DIR)/stack_list.o $(TMP_DIR)/DoubleList.o 21 $(COMPILER) $(FLAGS) -DLIST $(TEST_DIR)/test_stack.cpp $(TMP_DIR)/stack_list.o $(TMP_DIR)/DoubleList.o -o $(EXEC_DIR)/test_stack_list.out $(TEST_LIBS) 22 make test_stack_list 23 24## テスト実行 25.PHONY: test_stack_list 26test_stack_list: 27 $(EXEC_DIR)/test_stack_list.out 28 29# clean 30.PHONY: clean 31clean: 32 rm $(TMP_DIR)/*.o 33 rm $(EXEC_DIR)/*.out
ディレクトリ構造 ../ ├── EXEC │   └── test_stack_list.out ├── SRC │   ├── Makefile │   ├── Util │   │   ├── DoubleList.cpp │   │   ├── List.hpp │   ├── stack.hpp │   └── stack_list.cpp ├── TEST │   └── test_stack.cpp └── TMP ├── DoubleList.o └── stack_list.o

試したこと

  • テストプログラムのコンパイルー実行のみのmake
rm ../EXEC/test_stack_list.out make ../EXEC/test_stack_list.out

結果: 期待通りにテストプログラムのコンパイル後、テストが実行された。

  • テストプログラムコンパイル後のテスト実行(make test_stack_list)をコメントアウト
make clean make

結果: 前述のエラーメッセージのように意図しないコンパイルが実行される

調べたこと

Makefileには何かデフォルトでコンパイルを実行する機能があるのかと思い検索しましたが、関連する情報は得られなかった。
現在は依存ファイルの指定に問題がある可能性について調査中。

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

OS: macOS Catalina 10.15.6
make: GNU Make 3.81

最後に

Makefileを使いこなせるプログラマになりたいです...
どうかよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Makefileには何かデフォルトでコンパイルを実行する機能があるのかと思い

以下のオプションでその影響を排除できるのではないかと思います。

make --no-builtin-rules

投稿2020/07/27 14:27

KojiDoi

総合スコア13671

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

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

fujioka_cpp

2020/07/27 14:53

ありがとうございます。解決しました。 暗黙のルールがあることを初めて知りました。 さらに、 SUFFIXES: MAKEFLAGS += --no-builtin-rules でオプションをMakefileに書けることを知りました。(Suffixesなしではダメでした) .bashrcに alias make="make --no-buildin-rules"を追加することを考えましたが、暗黙のルールを利用しているMakefileに出会ったときに詰まりそうなので前述のMakefileに記述するのが良さそうですね
guest

0

Makefileには何かデフォルトでコンパイルを実行する機能があるのかと思い

基本機能なので、書いてないことは無いと思うのですが。
必要なターゲットが無いときに、そのターゲットを作れるファイルがあれば、コマンドが自動生成されます。
「ファイルの依存関係だけ記述しておけば、よしなにコンパイルコマンドを生成して実行してくれる」というのが簡単なプログラムでの使い方です。
foo: foo.o bar.oの1行だけとか。

Makefile無しでも、foo.cだけあれば、

sh

1あらかじめ 2export CFLAGS="-Wall -std=c99" 3しておいて、 4make foo

で、暗黙ルールによりcc -Wall -std=c99 foo.c -o fooを実行してくれます。使い捨てプログラムではよく使います。

投稿2020/07/27 16:40

otn

総合スコア84576

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問