2015-01-15 88 views
0

我有一个子目录obj bin src包含在其中的drectiry子目录测试。我有3个生成文件在一个在src一个obj和一个在子测试中。我想使用递归make,但是我有一个错误。 目录结构:Makefile包含来自其他目录的头文件

subdir-test 

     - Makefile1 
     - src 
      - all.c files and Makefile2 
     - obj 
      - all.o files and Makefile3 
     - include 
      - functions.h 
     - bin 

,这里是化妆文件: Makefile1:

SUBDIRS = src obj 

    subdirs : 
     for dir in $(SUBDIRS);\ 
     do \ 
     $(MAKE) -C $$dir ;\ 
     done 

    .PHONY : clean 

    clean : 
     rm -rf bin/* obj/* 

Makefile2:

inc = -I ../include/ 

    all : main.o factorial.o 

    main.o : main.cpp functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

    factorial.o : factorial.cpp functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

Makefile3:

run : main.o factorial.o 
     cc $^ -o ../bin/[email protected] 

在呼吁从分测试创建目录-f Makefile1我得到以下错误:

for dir in src obj;\ 
    do \ 
    make -C $dir ;\ 
    done 
make[1]: Entering directory `/home/betatest/Public/subdir-test/src' 
make[1]: *** No rule to make target `functions.h', needed by `main.o'. Stop. 
make[1]: Leaving directory `/home/betatest/Public/subdir-test/src' 
make[1]: Entering directory `/home/betatest/Public/subdir-test/obj' 
make[1]: *** No rule to make target `main.o', needed by `run'. Stop. 
make[1]: Leaving directory `/home/betatest/Public/subdir-test/obj' 
make: *** [subdirs] Error 2 

我有其他的问题,因为我想要写循环如下:

for dir in $(SUBDIRS) 
    do 
    $(MAKE) -C $$dir 
    done 

有我我也在循环中出错。我哪里错了。

+1

如果你的make文件没有命名为'makefile'或者'Makefile'(或者可能还有其他一些混合大小写变体,取决于你的'make'版本),那么你还必须告诉'make'要使用哪个文件 - 比如'make -C src -f Makefile2' ... – twalberg 2015-01-15 16:22:01

+0

这不是那个问题,但问题是头文件在包含文件夹中,它不包含在src文件夹中的Makefile2,所以我认为我在“inc”变量用法。请建议解决方案如何包含包含文件夹中的头文件。 – 2015-01-15 17:23:28

回答

1

你的makefiles是这样写的,我相信使用依赖关系的相对路径可以解决你的问题。由于您正在按正确的顺序处理目录,因此可以将Makefile1保持原样。

Makefile2将成为:

inc = -I ../include/ 

    all : main.o factorial.o 

    main.o : main.cpp ../include/functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

    factorial.o : factorial.cpp ../include/functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

而且makefile3大概可以保持不变,因为main.o和factorial.o不OBJ /只存在,因为在makefile2错误的。

请注意,目前main.o和factorial.o将始终被编译(并且可能会使用.PHONY),因为目标实际上是../obj/main.o,类似于run - > ../bin /跑。 在这种情况下,我不认为你可以通过使用三种不同的makefile获得太多收益,但这取决于你。

+0

谢谢@cacsar !!!!!它帮助我解决问题!!!!!!! – 2015-01-16 05:09:40

+0

如果您点击接受答案按钮,则声望将会提高。 – cacsar 2015-01-16 21:48:20

相关问题