Makefile, source in multiple directories, dependency problem
我正在尝试makefile ...主要是当源在许多目录中时
我有以下情况......
project / src /包含目录A,B,Main
目录A包含A.h和A.cpp; B含有B.cpp和B.h;和Test包含test.cpp
A.cpp包括A.h; B.cpp包括B.h和Main.cpp包括A.h,B.h
project / lib包含libA.a libB.a
A和B的Makefile很好......没有问题...我正在从对象创建库
然后将它们复制到lib目录中
例如。目录A的makefile和B的类似
1 2 3 4 5 6 7 | <wyn> all:test test : A.cpp A.hh g++ -c A.cpp -o A ar cru libA.a A.o cp libA.a pathto/project/lib </wyn> |
我有主目录的makefile为
1 2 3 4 5 | all: test test: test.o g++ -I.. -L../../lib test.o -o test -lA -lB test.o : test.cpp g++ -c test.cpp -o test.o |
一切正常......我唯一想解决的问题就是最后的可执行文件'test'
取决于来自libA和libB的对象,所以当A.h或A.cpp或B.h或B.cpp发生变化时,应该再次进行
所以,我现在改变了我的makefile
1 2 | test: test.o ../../libA.a ../../libB.a g++ -I.. -L../../lib test.o -o test -lA -lB |
代码>
现在,问题是我如何修改它,以便它只在它的时候再次进行测试
依赖关系比'test'更新。
制作libA和libB没有直接规则,Makefile需要和抱怨;
因为我将这些库从目录A和B复制到目录项目/ lib中。
所以,我猜一个解决方案就是在任何比'test'更新的东西时在相应的目录A和B中调用make但是我该怎么做呢?或者,赞赏任何其他更好的解决方案。
非常感谢 :)
编辑
在这里我做了什么,它解决了这个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 | .PHONY : libA libB </p> <p> ../../libA.a : libA libA : cd pathtoDirA; $(MAKE) </p> <p> ../../libB.a : libB libB : cd pathtoDirB; $(MAKE) |
代码>
您确实需要添加一个知道如何创建libA和libB的规则,然后将test中的依赖项添加到该规则中。规则可以在该目录中调用make(递归make),也可以显式编码用于在makefile中构建lib的规则。第一个更传统,很容易理解。它适用于您将在现场遇到的几乎所有情况,但如果您有更复杂的构建设置可能会出现一些潜在的问题(我可能会继续使用它,因为它更简单)。
我做这样的事情:
1 2 3 4 5 6 7 8 9 10 | A/ Makefile A.hpp A.cpp B/ Makefile B.hpp B.cpp Makefile test.cpp |
文件A / Makefile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | LIB = libA.so OBJS = A.o all: compile link compile: ${OBJS} link: g++ -shared -o ${LIB} ${OBJS} clean: rm -f ${OBJS} A.o: g++ -c A.cpp |
文件B / Makefile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | LIB = libB.so OBJS = B.o all: compile link compile: ${OBJS} link: g++ -shared -o ${LIB} ${OBJS} clean: rm -f ${OBJS} B.o: g++ -c B.cpp |
文件Makefile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | DIRS = A B OUTPUT = test LD = -L. -LA -LB -lA -lB OBJS = test.o all: compile link compile: ${OBJS} for DIR in ${DIRS}; do \ make -C $${DIR} compile; \ done link: for DIR in ${DIRS}; do \ make -C $${DIR} link; \ done g++ -o ${OUTPUT} ${OBJS} ${LD} clean: for DIR in ${DIRS}; do \ make -C $${DIR} clean; \ done rm -f ${OBJS} |
然后你可以:
1 2 | make compile make link |
要不就:
1 | make |
同样在子目录中的所有内容都将被编译并链接在一起
1 2 3 4 5 6 | PROJECTS = A B C D build: for dir in $(PROJECTS); do \ $(MAKE) -C $$dir build; \ done |
并按照您希望它们构建的顺序列出您的子项目。