我正在尝试创建一个每个src/
子文件夹都有一个目标的Makefile,以便创建一个静态库。
我目前正在尝试这个:
%.o: %.cpp
$(CXX) $(CXXFLAGS) $(INCLUDE) -c -o $@ $<
lib%.a: $(patsubst %.cpp, %.o, $(wildcard src/%/*.cpp))
$(AR) rcs $@ $^
但这不起作用,目标匹配起作用,但依赖性跟踪不起作用
如果我只是单独留下src/%/*.cpp
正确完成正确目录中的.cpp
文件,但是当我尝试在字符串函数中使用它来将.cpp
转换为{{1}时} .o
不再有用了。
答案 0 :(得分:2)
这很棘手,因为据我所知你不能在先决条件列表中使用像patsubst这样的函数。有不止一种方法可以做到这一点;这可能是最不丑陋的。将路径存储在变量中,然后重新调用make,以便可以在规则之外构建先决条件列表。
ifdef OBJPATH
LIBOBJECTS := $(patsubst %.cc,%.o,$(wildcard src/$(OBJPATH)/*.cc))
lib%.a: $(LIBOBJECTS)
$(AR) rcs $@ $^
else
lib%.a: src/%/*.cc
@$(MAKE) -s $@ OBJPATH=$*
endif