有没有办法进一步缩短和推广这个Makefile

时间:2014-10-26 21:31:42

标签: c++ makefile

我目前有以下Makefile

test:  main.o car.o student.o   house.o 
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o
    objcopy --only-keep-debug test test.debug   

main.o: student.h house.h    main.cpp
    $(CXX) $(CXXFLAGS) -c main.cpp

car.o: car.h

student.o: student.h car.h

house.o: house.h 

我的问题是我可以将文件缩短为类似

的文件
test:   *.o 
        $(CXX) $(CXXFLAGS) -o test *.o
        objcopy --only-keep-debug test test.debug   

目标依赖关系如何运作?我正在考虑追求某些东西的原因是因为我不想每次添加新的头文件或cpp文件时都向我的Makefile添加内容?

3 个答案:

答案 0 :(得分:1)

这可能会做你想要的,具有自动依赖重新计算:

CPPFLAGS += -MMD
SOURCES = $(wildcard *.C *.c *.cpp *.cxx *.c++)
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
.PHONY: all
all: appname appname.debug
appname.debug: appname
    objcopy --only-keep-debug $< $@
appname: $(OBJECTS)
include *.d

请参阅https://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Preprocessor-Options.html#Preprocessor-Options以获取-MMD - 选项,该选项在编译时将依赖关系提取到.d - 文件

我计算了所有可能的源文件,并从中计算了所有对象文件,因为 *.o只匹配现有文件

答案 1 :(得分:0)

你绝对可以在makefile中使用test: *.o

你可能不想这么做。对于新创建的.o文件,它永远不会包含.c个文件,因为它们不存在。

您可以使用$^ automatic variable删除配方正文中的每个文件。

答案 2 :(得分:0)

每次添加cpp文件时“向Makefile添加内容”都是的想法,你应该说服自己。

第一个原因是,如果每次更改源列表时更改Makefile,并且您将目标依赖于Makefile,那么当您更改源列表时,目标将自动重新编译,这就是它的方式Make旨在工作。不要打它。

第二个原因是,您希望在某处明确声明您的来源,以便您可以向自己和他人阐明您的意图。我的实践表明,这使代码更易于维护。

第三个原因是,您可以使用相同的扩展名添加其他文件(可能是临时文件),这些文件不是源文件。

记住这一点,我认为这是重写Makefile的最佳方法。请注意,我没有在此处执行任何自动依赖项生成。如果你这样做,那么你可以自动生成.o文件的.h文件的各种依赖关系,而不是列出其他人指出的那些文件。

SRCS := main.cpp car.cpp student.cpp house.cpp

OBJS := $(SRCS:cpp=o)

.PHONY: all
all: test test.debug

test:  $(OBJS) Makefile 
    $(CXX) $(CXXFLAGS) -o $@ $(OBJS)

%.debug: % Makefile
    objcopy --only-keep-debug $< $@  

$(OBJS): %o: %cpp Makefile
    $(CXX) $(CXXFLAGS) -c $< 

main.o: student.h house.h

car.o: car.h

student.o: student.h car.h

house.o: house.h