【发布时间】:2018-11-13 04:18:02
【问题描述】:
我使用以下 Makefile 编译 C++ 文件,但发生了一些意外行为。环境是 MacOS X Mojave。 Makefile 如下:
CC=gcc
CXX=g++
CXXFLAGS=-std=c++11
RM=rm -f
all: clean sort_test ds_test
sort_test: data_structure sort .sort_test.o .sort_test
.sort_test: sort_test.o sort.o ds.o
$(CXX) $(CXXFLAGS) -o sort_test sort_test.o sort.o ds.o
.sort_test.o: sort_test.cpp ../include/io.hpp
$(CXX) $(CXXFLAGS) -c -o sort_test.o sort_test.cpp
sort: ../include/sort.hpp ../include/data_structure.hpp ../src/sort.cpp
$(CXX) $(CXXFLAGS) -c -o sort.o ../src/sort.cpp
data_structure: ../include/data_structure.hpp ../src/data_structure.cpp ../include/io.hpp
$(CXX) $(CXXFLAGS) -c -o ds.o ../src/data_structure.cpp
ds_test: data_structure .ds_test.o .ds_test
.ds_test: ds.o ds_test.o
$(CXX) $(CXXFLAGS) -o ds_test ds.o ds_test.o
.ds_test.o: ds_test.cpp ../include/io.hpp ../include/data_structure.hpp
$(CXX) $(CXXFLAGS) -c -o ds_test.o ds_test.cpp
clean:
$(RM) *.o sort_test ds_test
当我在同一目录中运行“make ds_test”时,发生了一些奇怪的事情:
g++ -std=c++11 -c -o ds_test.o ds_test.cpp
g++ -std=c++11 -c -o ds.o ../src/data_structure.cpp
g++ -std=c++11 -c -o ds_test.o ds_test.cpp
g++ -std=c++11 -o ds_test ds.o ds_test.o
gcc ds_test.o data_structure .ds_test.o .ds_test -o ds_test
clang: error: no such file or directory: 'data_structure'
clang: error: no such file or directory: '.ds_test.o'
clang: error: no such file or directory: '.ds_test'
make: *** [ds_test] Error 1
此输出中的第一行和第五行永远不会用于命令“make ds_test”,因为它应该只调用“data_structure”、“.ds_test.o”和“.ds_test”。 任何人,请解释为什么会发生这些额外的意外行为以及如何避免它?谢谢!
【问题讨论】: