C++ 所有文件的Makefile
如何为我的结构编写makefile:C++ 所有文件的Makefile,c++,makefile,C++,Makefile,如何为我的结构编写makefile: / -- /bin /out /src -- /dir1 /dir2 ... /dirN main.cpp 我想: 从/src目录递归编译所有文件 将所有.out文件发送到/out,不带src目录结构 使用所有.out文件编译main.cpp 我有.c和.cpp文件要编译和链接 我试过: ${OBJ_DIR}/%.o: $(SRC_DIR)/%.cpp $(
/ --
/bin
/out
/src --
/dir1
/dir2
...
/dirN
main.cpp
我想:
- 从/src目录递归编译所有文件
- 将所有.out文件发送到/out,不带src目录结构
- 使用所有.out文件编译main.cpp
.c
和.cpp
文件要编译和链接
我试过:
${OBJ_DIR}/%.o: $(SRC_DIR)/%.cpp
$(CXX) -c $< -o $@ ${CFLAGS}
${OBJ_DIR}/%.o:$(SRC_DIR)/%.cpp
$(CXX)-c$<-o$@${CFLAGS}
但我现在不知道如何制定
all
rule…这是我创建的一个Makefile,我在很多项目中都使用它:
# Compiler
CC = g++
OPTS = -std=c++11
# Project name
PROJECT = foo_example_program
# Libraries
LIBS = -lpthread
INCS = -I./src/include
SRCS = $(shell find src -name '*.cpp')
DIRS = $(shell find src -type d | sed 's/src/./g' )
OBJS = $(patsubst src/%.cpp,out/%.o,$(SRCS))
# Targets
$(PROJECT): buildrepo $(OBJS)
$(CC) $(OPTS) $(OBJS) $(LIBS) $(INCS) -o $@
out/%.o: src/%.cpp
$(CC) $(OPTS) -c $< $(INCS) -o $@
clean:
rm $(PROJECT) out -Rf
buildrepo:
mkdir -p out
for dir in $(DIRS); do mkdir -p out/$$dir; done
#编译器
CC=g++
OPTS=-std=c++11
#项目名称
PROJECT=foo\u示例\u程序
#图书馆
LIBS=-lpthread
INCS=-I./src/包括
SRCS=$(shell查找src-name'*.cpp')
DIRS=$(shell find src-type d | sed's/src//g')
OBJS=$(patsubst src/%.cpp,out/%.o,$(SRCS))
#目标
$(项目):buildrepo$(OBJS)
$(CC)$(OPTS)$(OBJS)$(LIBS)$(INCS)-o$@
out/%.o:src/%.cpp
$(CC)$(OPTS)-c$<$(INCS)-o$@
清洁:
rm$(项目)输出-Rf
buildrepo:
mkdir-p输出
对于dir,单位为美元(dir);do mkdir-p out/$$dir;完成
注意:回想起来,我记得为什么我复制了src目录结构——也就是说,如果两个文件在多个目录中被命名为相同的东西,它们将相互覆盖。解决这个问题的一个方法是向每个对象文件添加某种类型的标识符。例如,末尾有一个数字。当发现重复的对象文件时,您可以将对象文件命名为“object.1.o”和“object.2.o”或其他名称。您尝试过cmake吗+1对于CMake来说,这是一个优雅的解决方案problem@klm123-嗯。。。但是我找不到任何关于它的好教程,我必须首先将所有文件从/src编译到.o(g++-c),并将所有.o链接到一个可执行文件中,其中包含大量库(如-lGL,-lpthread…),这对于并行构建是不安全的,除非在开始构建之前先手动运行
makebuildrepo
。此外,OP正在寻找一种解决方案,可以直接将所有对象文件转储到out
,而不需要额外的目录结构(因此src/foo/bar/biz.c
将被编译成out/biz.c
)@madaha,我稍微修改了一下,以便能够在变量中设置对象目录,但它仍然使用src目录结构。。。我自己对此很好奇,所以我也会努力弄清楚。编辑:事实上,我刚刚记得,当您运行“make”时,会自动调用buildrepo。目录结构是一个示意图;)只有一个目录中的所有.o看起来better@aso我记得我为什么这样做。我对答案的编辑解释了原因。是的,我来自波兰:D非常感谢您的更新,我做了一些更改,现在工作起来很有魅力:)