我正在创建一个Rules.make
文件,类似于Linux的2.0版本,它包含各种目标,包括.so
文件。我的目标是只需要制作这样的极简主义Makefile:
include $(DIR_TOP)/Rules.make
在包含我需要编译的任何源文件的目录中。这些规则还使我能够在";主";Makefile:
something: something_else lib.so
,使得首先完成something_else
,然后构建lib.so
。
一切都很顺利,直到我决定向前面提到的共享库目标添加依赖项。我想下面这样的东西会起作用:
${DIR_OUT}/%.so: $(shell find $(dir $@) -name *.o)
$(CC) $(CFLAGS) -o $@ $(CLIBS) -shared $^
然而,令我死亡的是,$(dir $@)
显然扩展到了$(dir ${DIR_OUT}/%.so)
,然后产生了简单的${DIR_OUT}
,这正是我所需要的。DIR_OUT
只是顶级目录字符串,但目标可以从任何子目录调用,或者像target: $(DIR_OUT)/path/to/lib.so
一样调用。我希望%
不仅可以匹配文件名,还可以匹配任何目录(确实如此(,然后在确定完整路径后将其扩展到$@
。有了这个解决方案,不仅我需要的对象文件被包括在构建过程中,而且输出文件夹中的任何其他对象文件都会产生multiple definition of x y z
等错误。
有没有其他方法可以获得我想要构建的共享库的依赖项列表?理想情况下,这是一个纯粹基于Makefile的解决方案,但如果没有,我也喜欢一些bash
脚本。
解决方案是二次扩展:
.SECONDEXPANSION:
${DIR_OUT}/%.so: $$(shell find $$(dir $$@) -name *.o)
$(CC) $(CFLAGS) -o $@ $(CLIBS) -shared $^