关于c ++:Makefile,多个目录中的源代码,依赖问题

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

同样在子目录中的所有内容都将被编译并链接在一起


make -C dir是你的朋友。做类似的事情:

1
2
3
4
5
6
PROJECTS = A B C D

build:
    for dir in $(PROJECTS); do \
        $(MAKE) -C $$dir build; \
    done

并按照您希望它们构建的顺序列出您的子项目。