我有以下目录结构:
.
..
./Graphic/
./Graphic/SymbolXLib
这个项目中还有其他几个目录,但我不会为了简单而列出它们。我想要一个主makefile来驱动存储在自己目录中的其他Makefile的构建。有几个项目汇集在一起,所以我不能只是移动源代码。
主makefile定义为:
[mehoggan@hogganz400 Core]$ cat ./Makefile
CORE_LIBS_DIR = libs
OBJS_DIR = obj/symb_obj
include ./Graphic/SymbolXLib/Makefile
Graphic makefile定义为:
#
# make BUILD_MODE={release|debug} OS_ARCH={32|64}
#
# default is 32-bit release build
#
BUILD_MODE = release
OS_ARCH = 64
OBJS_DIR = $(BUILD_MODE)$(OS_ARCH)
SRC = \
./Graphic/SymbolXLib/CartoCursor.cpp \
...
./Graphic/SymbolXLib/TextureConversion.cpp \
$(NULL)
CC = gcc -fPIC
OBJS = $(SRC:%.cpp=$(OBJS_DIR)/%.o)
COPTS = -m$(OS_ARCH) -O2
CDEFS = -DLINUXx86 \
-I../../../SharedArcGIS/Include/GraphicsPipeline/Display/SymbolX/SymbolXLib \
-I../../../SharedArcGIS/Include/System/Geometry/GeometryXLib \
-I../../../ArcSDE/pe/include \
-I../../../ArcSDE/shape/include
CFLAGS = $(COPTS) $(CDEFS) $(CINCS)
TARGET = libSymbolXLib.a
all : $(OBJS_DIR) $(OBJS_DIR)/$(TARGET)
$(OBJS_DIR) :
mkdir -p $(OBJS_DIR)
$(OBJS_DIR)/$(TARGET) : $(OBJS)
ar qc $@ $^
$(OBJS_DIR)/%.o : %.cpp
$(CC) -c $(CFLAGS) -o $@ $<
上一篇文章(Previous Post)的回复只有在我搬了很多东西时才有帮助。我不能这样做。所以问题仍然存在,如何让make识别主Makefile中子目录中的隐式构建?
我得到的错误是
make: *** No rule to make target `release64/./Graphic/SymbolXLib/CartoCursor.o', needed by `release64/libSymbolXLib.a'. Stop.
答案 0 :(得分:3)
如果你避免include
而是使用recursive make
,我必须认为你会有更好的成功。在顶级Makefile
中,类似于:
graphic:
$(MAKE) -C Graphic
Makefile
中的Graphic/Makefile
可以有子项目:
symbolxlib:
$(MAKE) -C SymbolXLib
等等。您可能需要将每个目标添加到默认目标或类似的东西,以便在一次执行时将它们全部挂起。您可以为这些目标中的每一个提供一个实际的依赖关系(如果它们没有依赖关系,它们应该是.PHONY:
...)仅在必要时或在由{{的高级目标命令时重建它们... 1}} es“命令文件”。
或者,this paper建议采用不同的方法避免递归touch(1)
,但我还没有读过它 - 并且发现了递归make
的工作原理在项目中,我已经参与其中,我不介意推荐它。
答案 1 :(得分:2)