隐式构建规则:GNU Make Multiple Makefiles Multiple Directories
Implicit Build Rules: GNU Make Multiple Makefiles Multiple Directories
我有以下目录结构:
.
..
./Graphic/
./Graphic/SymbolXLib
在这个项目中还有其他几个目录,但为了简单起见,我不会列出它们。我想要一个主要的makefile,它驱动存储在自己目录中的其他makefile的构建。有几个项目同时进行,所以我不能随便移动源代码。
主makefile定义为:
[mehoggan@hogganz400 Core]$ cat ./Makefile
CORE_LIBS_DIR = libs
OBJS_DIR = obj/symb_obj
include ./Graphic/SymbolXLib/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 $@ $<
上一篇文章的回应只有在我移动了很多东西的时候才有帮助。我做不到。所以问题仍然存在,我如何让make从主Makefile识别子目录中的隐式构建?
我得到的错误是make: *** No rule to make target `release64/./Graphic/SymbolXLib/CartoCursor.o', needed by `release64/libSymbolXLib.a'. Stop.
我不得不认为,如果你避免使用include
而使用递归make
,你会取得更大的成功。在顶级Makefile
中,类似于:
graphic:
$(MAKE) -C Graphic
Graphic/Makefile
中的Makefile
可以有子项目:
symbolxlib:
$(MAKE) -C SymbolXLib
等等。您可能需要将每个目标添加到默认目标或类似的东西中,以便在一次执行中将它们全部挂在一起。您可以为每个目标指定一个实际的依赖项(如果它们没有依赖项,它们应该是.PHONY:
…),以便仅在必要时或由touch(1)
称为"命令文件"的上层目标命令时重新构建它们。
或者,这篇论文推荐了一种不同的方法来避免递归make
,但是我还没有读过它——并且发现递归make
在我参与的项目中工作得很好,所以我不介意推荐它。
这个gnumake文档对你有帮助吗?
相关文章:
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- make 命令如何避免重新编译未更改的源文件?
- MAKE:找不到包含的用户定义的头文件?
- 'make check' GLIBC 运行时的链接问题
- "multiple overloads"使用具有重复类型的模板化类
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- make 命令创建 .file,但不创建应用程序文件
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- 使用"multiple"命名空间单行
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- 仅在使用 gradle 在 Travis CI 上编译时才"multiple definition" googletest 符号
- 如何使用MySQL Connector and Make设置C++项目
- 使用 make 将对象文件放在特定目录中
- 我是 C++ 的新手,我试图调用 make 一个以 2 个类作为其参数的类构造函数
- "Make"失败并出现 Clang 错误 - 如何从 Clang 获得错误?
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- 隐式构建规则:GNU Make Multiple Makefiles Multiple Directories