我尝试编写此格式的make
规则:
lib%.so: computations/%.h
make -C computations/ -f makefile $<
输出:
make -C computations/ -f makefile computations/test.h
make[1]: Entering directory `/home/shai/csm/csm2/src/computations'
make[1]: *** No rule to make target `computations/test.h'. Stop.
make[1]: Leaving directory `/home/shai/csm/csm2/src/computations'
make: *** [libtest.so] Error 2
好吧,它似乎在切换库后查找%.h
。没什么大不了的,我只想尝试删除
lib%.so: %.h
make -C computations/ -f makefile $<
但现在根本不承认这条规则!
输出:
shai@ubuntu:~/csm/csm2/src$ make libtest.so
`make: *** No rule to make target `libtest.so'. Stop.
make
在玩我的想法吗?如何更改依赖关系会使其停止识别目标?
答案 0 :(得分:2)
如何更改依赖关系使其停止识别目标?
最有可能的原因是它无法找到符合依赖关系模式的文件,因为test.h
位于另一个目录中。您可以使用VPATH
让它搜索其他目录中的文件。
修改:但这仍然无法完全解决您的问题,因为$<
将被computations/test.h
替换,而computations
目录中找不到$(notdir $<)
。你得到的第一个错误)。您可以尝试{{1}},但我认为这是一个丑陋的黑客(如果它有效;我还没有尝试过)。这是因为makefile和项目结构的设计。
答案 1 :(得分:2)
你正在使用make。
Make的设计实际上相当简单:你告诉它
然后创建topological sorts依赖项信息,以便按正确的顺序执行主体。
您的$<
规则(扩展到依赖项列表)意味着您告诉调用的make创建依赖项%.h
而不是目标lib%.so
。
规则必须创建目标。如果需要创建依赖关系,则需要告诉make如何使用另一个单独的规则执行此操作,而不是尝试确保它在此规则中是最新的。
当您尝试跨目录进行协调时,我会推荐论文Recursive make considered harmful,这通常是组织事物的好方法,但不是唯一可行的方法。
答案 2 :(得分:0)
它可能只是你复制/粘贴它的方式,但你错过了第二种形式的标签。