gpt4 book ai didi

c++ - 许多子文件夹的 Makefile

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:30 27 4
gpt4 key购买 nike

我有以下文件夹结构:

├── build
├── external
│   ├── build
│   ├── lib1
│   │   ├── lib1Classes.cc
│   │   └── lib1Classes.h
│   ├── lib2
│   │   ├── lib2Classes.cc
│   │   └── lib2Classes.h
│   ├── lib3
│   │   ├── lib3Classes.cc
│   │   └── lib3Classes.h
│   └── Makefile
├── include
│   ├── SomeClass.h
│   └── SomeOtherClass.h
├── Makefile
└── src
├── main.cpp
├── SomeClass.cc
└── SomeOtherClass.cc

我试图先将 libXClasses.cc 和 libXClasses.h 编译成 ./external/build/libX.o,然后将所有 libX.o 组合成一个 ./external/build/external.so。在第 2 步中,我想将 SomeClass.h 和 SomeClass.cc 编译成 ./build/SomeClass.o 和 SomeOtherClass.h,将 SomeOtherClass.cc 编译成 ./build/SomeOtherClass.o。最后,我想将 ./external/build/external.o 和 ./build/*.o 链接到 ./build 中的二进制文件中。

然而,我已经在步骤 1 中失败了。我对 ./external/Makefile 的想法是这样的:

CXX = g++ -std=c++11

TARGET ?= external.so
BUILD_DIR ?= ./build

# get all source files
SRCS = $(shell find . -name *.cc -or -name *.cpp -or -name *.h)
# get the name of all directories that contain at least one source file
SRC_DIRS ?= $(foreach src,$(SRCS),$(shell dirname $(src)))
# remove duplicate directories
SRC_DIRS := $(shell echo $(SRC_DIRS) | xargs -n1 | sort -u | xargs)
# define one target object file foreach .cc source file
OBJS := $(foreach srcd,$(SRC_DIRS),$(BUILD_DIR)/$(patsubst %.cc,%.o,$(shell find $(srcd) -name *.cc -printf "%f\n")))

# rule to build ./external/build/external.so
$(BUILD_DIR)/$(TARGET): $(OBJS)
$(CXX) -shared $(OBJS) -o $@

# no idea how to build libX.o in one rule
$(BUILD_DIR)/%.o: %.cc %.h
$(CXX) -c -fpic $< -o $@

这不起作用,因为在最后一条规则中我没有指定正确的 .cc 和 .h 来自哪里。但我根本不知道我该怎么做。我是否必须分别为每个 libX 目录编写规则?如果我有 10 个或 20 个 libX 目录怎么办?

干杯!

最佳答案

第 1 步:创建 libX 目录的列表(因为没有人愿意手动维护这样的列表):

LIBS := $(wildcard external/lib*)

第 2 步:创建源文件列表:

LIB_SRCS := $(notdir $(wildcard $(addsuffix /*.cc, $(LIBS))))

(我删除了路径,因为它们很麻烦;有不止一种方法可以做到这一点。)

第 3 步:创建所需目标文件的列表:

OBJS := $(patsubst lib%Classes.cc, external/build/lib%.o, $(LIB_SRCS))

第 4 步:编写构建这些文件的规则:

vpath %.cc $(LIBS)

$(OBJS): external/build/lib%.o: lib%Classes.cc
$(CXX) -c -fPIC -I$(dir $<) $< -o $@

(第 5 步:编写构建库的规则,但您已经有了。)

还可以做得更多。此生成文件未检测到 libN.o 依赖于 libNClasses.h 这一事实。可以设置,但是有点复杂,一天就够了。

关于c++ - 许多子文件夹的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46366262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com