Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 所有文件的Makefile_C++_Makefile - Fatal编程技术网

C++ 所有文件的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 $(

如何为我的结构编写makefile:

/ --
   /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非常感谢您的更新,我做了一些更改,现在工作起来很有魅力:)