在 Makefile 中处理多个扩展的优雅方法
An elegant way to handle multiple extensions in Makefile
我有一个由几个源代码和头文件组成的小型C++语言项目,我使用Makefile来构建我的项目。
最近,我在项目中添加了一个最初只有.cpp文件的.c文件。为了构建包括.c文件在内的整个项目,我修改了我的Makefile,如下所示:
SRC_DIR := src
INC_DIR := include
BUILD_DIR := build
C_EXT := c
CPP_EXT := cpp
SOURCES := $(shell find $(SRC_DIR) -type f -name *.$(CPP_EXT))
$(shell find $(SRC_DIR) -type f -name *.$(C_EXT)) # Added!
...
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(CPP_EXT) $(INC_DIR)/%.h
@mkdir -p $(BUILD_DIR)
$(CXX) $(CFLAGS) -I $(INC_DIR) -c -o $@ $<
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(C_EXT) $(INC_DIR)/%.h # Added!
@mkdir -p $(BUILD_DIR) # Added!
$(CXX) $(CFLAGS) -I $(INC_DIR) -c -o $@ $< # Added!
但我认为这有点丑陋,因为命令重复。有没有办法删除重复项并改进此 Makefile 命令?
Make 附带了用于构建 C 和 C++ 的默认规则,因此对于基本用法,您不必担心这一点。 由于您正在更改规则以创建更复杂的构建工具,因此您可能只想在一点点重复上咬紧牙关(在您的示例中,它不是那么多)。 您可以将这样的东西放在一个通用的make include
文件中,并将其用于所有类似的项目 - 这样它就不会弄乱特定于项目的makefile。
然而。。。
GNU make 确实有定义和调用函数的规定,尽管它们可能很模糊。
define do_compile
@mkdir -p $(BUILD_DIR)
$(CXX) $(CFLAGS) -I $(INC_DIR) -c -o $@ $<
endef
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(CPP_EXT) $(INC_DIR)/%.h
$(call do_compile)
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(C_EXT) $(INC_DIR)/%.h # Added!
$(call do_compile) # Added!
相关:生成文件中的函数?
相关文章:
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- C++重构,扩展方法typedef
- 扩展中的日期时间对象方法C++问题
- 从库类扩展,然后如何让库调用派生类方法
- 对于我扩展此程序来计算最高10x10矩阵的倒数的最简单方法是什么
- 我想继承 SPIFFS 类来扩展它以用于我的方法.可能吗
- C++可扩展的工厂方法
- 如何调用QT快速2扩展插件的方法
- C#扩展方法类似物在C 中
- 在 Makefile 中处理多个扩展的优雅方法
- 通过宏扩展调用方法
- Python 扩展方法的分段错误
- 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包
- 覆盖我正在扩展的嵌套类的方法
- 按特定顺序扩展可变参数模板值的最有效方法是什么?
- 如何在 Ruby-C++ 扩展C++类中编写非静态方法
- 重写扩展现有函数的方法
- 为什么这种搜索方法不可扩展
- 扩展此C++工厂实现的最佳方法
- 这种使用虚拟受保护方法扩展库的方式是否安全