首页 文章

GNU make中的复杂模式替换

提问于
浏览
1

我有以下想法:所有源文件都在 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 变量似乎已正确填充,但我无法创建对象列表 . 根据文档,第二个想法应该有效,但事实并非如此 . 替换语句有什么问题 .

要明确:我希望有例如

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

我想从中创建以下列表

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

1 回答

  • 1

    有一种更简单的方法:

    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 $@
    

相关问题