linux - GNU make 中的复杂模式替换

标签 linux makefile

我有以下想法: 所有源文件都在 SRC 目录中,而所有目标文件都保存在 OBJ 目录中。在 GNU makefile 中,我想自动搜索所有源文件并创建源文件对象列表和 o 文件对象列表。我尝试了以下两种语法,我都得到了

没有规则来创建目标“/home/Serial/obj/Serial.o”,需要...

这里是想法:

c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(patsub %.c,%.o,$(c_files) )


c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(patsub $(SRC)/%.c,$(OBJ)/%.o,$(c_files) )

c_files 变量似乎已正确填充,但我无法创建对象列表。根据文档,第二个想法应该可行,但没有。 replace 语句有什么问题。

要明确:我希望有例如

c_files = src/file1.cc src/file2.cc src/file109.cc

我想从中创建以下列表

o_files = obj/file1.o obj/files.o obj/file109.o

最佳答案

有一个更简单的方法:

o_files = $(c_files:.cpp=.o)

并获得一个自动编译目标文件的模式:

obj/%.o: src/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@

合并:

c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(c_files:.cpp=.o)

all: $(PROG)

$(OBJ)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@

$(PROG): $(o_files)
    $(LD) $(LDFLAGS) $^ -o $@

关于linux - GNU make 中的复杂模式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12634234/

相关文章:

linux - 解压单文件挂起

installation - 制作 : *** [Makefile:1280: install] Error 1

c - 无法用 make 编译 | fatal error 设备上没有剩余空间

java - 在 CentOS 中禁用 UseGCOverheadLimit

linux - Bash shell - 按时间顺序统计并显示目录和子目录列表

cmake 和 make 构建重现性

c++ - Makefile:在全局变量初始化之前通过 'make all' 命令运行 bash 脚本

c - 编译使用 libvncserver 的项目时出错

linux - 移动所有不以特定字母开头的文件

linux - BASH-计算同一行中某些字段的平均值