【发布时间】:2017-03-26 12:37:07
【问题描述】:
我对带有子目录的项目的 makefile 有疑问。 项目目录树如下:
project
├── Makefile
├── main.cpp
|
├── lib1
│ ├── lib1.cpp
│ ├── lib1.h
│ └── Makefile
|
├── lib2
│ ├── Makefile
│ ├── lib2_1.cpp
│ ├── lib2_1.h
| ├── lib2_2.cpp
│ └── lib2_2.h
|
├── lib3
│ ├── Makefile
│ ├── lib3.cpp
│ └── lib3.h
每个subdir(lib1, lib2...)的makefile是这样的:
SRC_DIR = ./
BUILD_DIR = ./obj/
DEPS = lib1.o
all: $(BUILD_DIR)$(DEPS)
$(BUILD_DIR)%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h
mkdir -p $(BUILD_DIR)
g++ --std=c++11 $< -c -o $@
clean:
rm -fr $(BUILD_DIR)
我的问题是:如何创建位于项目目录中的 make 文件,或者 makefile “root”? 我无法创建递归执行子目录中的 makefile 并链接每个子目录的 obj 文件夹中的所有目标文件的 makefile。
你能帮帮我吗?请
【问题讨论】:
-
只是一个不能解决你问题的评论。或者也许会? ;) 恕我直言,每个子目录都应该有一个 archive/so 目标,而不是 lib1.o 目标。
-
为什么每个子目录都应该有一个so目标?
-
存档/所以,选择一个。我不知道您要构建什么,但您的目录名为 lib[123],所以我假设您正在构建库。
-
是的,我可以将它们构建为 .so 文件,但是如果我创建 .so 文件,使用“根”makefile 会有所改变?
-
您不应该创建共享库。这将使您的程序非常复杂,因为您必须将 .so 与您的程序一起提供,确保您的程序可以在运行时找到它们,等等。您可以使用静态库(.a 或档案):这与使用 .o。
标签: c++ c recursion makefile subdirectory