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

Is there a way to further shorten and generalize this Makefile

本文关键字:Makefile 进一步 有没有      更新时间:2023-10-16

我目前有以下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添加一些东西?

这可能会实现您想要的功能,并自动重新计算依赖项:

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--MMD-选项的选项,该选项在编译时提取对.d-文件的依赖关系

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

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

不过你可能不想。这将永远不会包括新创建的.c文件的.o文件,因为它们将不存在。

您可以通过使用$^自动变量来取消在配方主体中列出每个文件的操作。

"每次添加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