前提・実現したいこと
####前提
- 自作のリスト構造クラスを利用したスタック構造クラスの実装中。
- テストフレームワークとして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を使いこなせるプログラマになりたいです...
どうかよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/27 14:53