有没有办法进一步缩短和推广这个Makefile
Is there a way to further shorten and generalize this 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添加一些东西?
这可能会实现您想要的功能,并自动重新计算依赖项:
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
- 针对遗留库的链接:来自预制makefile的-lgfortranbegin
- 使用 Makefile 中的头文件编译 Pybind (不使用 cmake)
- 如何在使用Makefile构建后在cmd中运行该程序?
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 如何在macOS上使用Makefile?
- Makefile 创建两个库 - 一个依赖于另一个
- 我将 Makefile 更改为 C++11 版本,但仍然收到列表初始值设定项错误
- Arduino-Makefile:编译器无法编译用户库 cpp 文件
- 使用boost::mapped_region增长文件以供进一步写入?
- Makefile by ocaml 和 cpp 扩展名
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 从 Makefile 中的 $@ 获取文件名
- 如何使用 Makefile 使用 VTK 库编译项目?
- 将数据从 c++ 文件连续发送到 Python 脚本以进行进一步处理
- 在 Windows 10 下为 VTK 生成 Makefile 时,Qt mkspecs 的路径错误
- 如何在makefile中包含tensorflow c ++".so"文件?
- 附加作为空字符串的 ostream 可防止进一步追加
- 有没有办法进一步缩短和推广这个Makefile