【问题标题】:Makefile, source in multiple directories, dependency problemMakefile,源码在多个目录,依赖问题
【发布时间】:2009-07-21 20:28:57
【问题描述】:

我正在尝试使用 makefile...主要是当源位于许多目录中时

我有以下情况...

project/src/ 包含目录 A、B、Main

目录A包含A.h和A.cpp; B包含B.cpp和B.h;并且测试包含 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 类似的文件

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

我有主目录的makefile


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

一切正常……我唯一想解决的是最终可执行的“测试” 依赖于来自 libA 和 libB 的对象,因此当 A.h 或 A.cpp 或 B.h 或 B.cpp 发生变化时,应再次进行 所以,我现在将我的makefile更改为


test: test.o ../../libA.a ../../libB.a
  g++ -I.. -L../../lib test.o -o test -lA -lB

现在,问题是我如何修改它,以便它只有在它 依赖项比“测试”更新。 没有直接的规则来制作 libA 和 libB,这是 Makefile 要求和抱怨的; 因为我将这些库从目录 A 和 B 复制到目录 project/lib 中。

所以,我想一种解决方案是在各自的目录 A 和 B 中调用 make 当任何东西都比“测试”新时,但我该怎么做呢?或者,任何其他更好的解决方案都值得赞赏。

非常感谢:)

编辑

我做了什么,它解决了问题

.PHONY : libA libB

../../libA.a:libA 库: cd pathtoDirA; $(制作)

../../libB.a : libB 库B: cd pathtoDirB; $(制作)

【问题讨论】:

    标签: c++ makefile


    【解决方案1】:

    您确实需要添加一个知道如何生成 libA 和 libB 的规则,然后将 test 的依赖项添加到该规则上。该规则可以调用该目录中的 make(递归 make),或者显式编码用于在 makefile 中构建库的规则。第一个更传统,很容易理解。它适用于您在现场遇到的几乎所有情况,但如果您有更复杂的构建设置,可能会出现一些potential issues(我可能会选择它,因为它更简单)。

    【讨论】:

    • “RMCH”+1。我喜欢 make,但我有点落后,而且我对使用大量包含的包容性 make 模型感到满意,并且许多常见的配方确实维护了常见的编译器设置并减少了重复。不过,设置起来有点痛苦,我认为 90% 的人可能会使用更现代的工具(scons、cmake 等)做得更好。
    【解决方案2】:

    make -C dir 是你的朋友。执行以下操作:

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

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

    【讨论】:

    【解决方案3】:

    我会这样做:

     A/
      Makefile
      A.hpp
      A.cpp
     B/
      Makefile
      B.hpp
      B.cpp
     Makefile
     test.cpp
    

    文件 A/Makefile:

     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:

     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
    

    文件生成文件:

    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}
    

    那么你可以:

     make compile
     make link
    

    或者只是:

     make
    

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

    【讨论】:

    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多