使用源子目录创建文件

时间:2011-03-11 13:18:30

标签: makefile

我的最新项目是使用C ++编写的,我使用的是GNU Make。 项目目录布局如下:

project
|-src
  |-subdir1
  |-subdir2 (containing tests)
|-doc
|-bin

我希望能够在顶级目录中调用make(即需要项目目录中的makefile)来编译“src”子目录中的所有源代码并将生成的二进制文件放在“bin”中“ 目录。

这样做的最佳方法是什么?如果我不必为每个源文件添加一个make规则,但是只需要为目录中的所有.cc和.h文件添加一个make规则,这也会很棒。

3 个答案:

答案 0 :(得分:14)

Make允许您概括规则,因此您不需要为每个文件创建一个。

project
|-src
  |-subdir1
  |-subdir2 (containing tests)
|-doc
|-bin

您可以尝试这样的事情:

#This finds all your cc files and places then into SRC. It's equivalent would be
# SRC = src/main.cc src/folder1/func1.cc src/folder1/func2.cc src/folder2/func3.cc

SRC = $(shell find . -name *.cc)

#This tells Make that somewhere below, you are going to convert all your source into 
#objects, so this is like:
# OBJ =  src/main.o src/folder1/func1.o src/folder1/func2.o src/folder2/func3.o

OBJ = $(SRC:%.cc=%.o)

#Tells make your binary is called artifact_name_here and it should be in bin/
BIN = bin/artifact_name_here

# all is the target (you would run make all from the command line). 'all' is dependent
# on $(BIN)
all: $(BIN)

#$(BIN) is dependent on objects
$(BIN): $(OBJ)
    g++ <link options etc>

#each object file is dependent on its source file, and whenever make needs to create
# an object file, to follow this rule:
%.o: %.cc
    g++ -c $< -o $@

答案 1 :(得分:3)

使用一个make运行来进行构建(我不是递归make的粉丝)。不要使用$(shell)因为它会影响性能。将构建产品放入临时目录。

草图:

subdir1-srcs := $(addprefix subdir1/,1.cc 2.cc 3.cc)
subdir1-objs := ${subdir1-srcs:subdir1/%.cc=subdir1/obj/%.o)
bin/prog1: ${subdir1-objs} ; gcc $^ -o $@
${subdir1-objs}: subdir1/obj/%.o: subdir1/%.cc # Static pattern rules rule
    gcc -c $< -o $@
${subdir1-objs}: subdir1/obj/.mkdir # Need to create folder before compiling
subdir1/obj/.mkdir:
    mkdir -p ${@D}
    touch $@

你能看到这里的锅炉盘吗?与$(eval)一起使用的一些函数应该允许您编写:

$(call build,bin/prog1,subdir1,1.cc 2.cc 3.cc)
$(call build,bin/prog2,subdir2,a.cc b.cc c.cc d.cc)

将这些目标自动添加为虚假all的依赖关系,并且很好-j兼容(只需键入make -j5 all即可构建)。

答案 2 :(得分:-1)

您必须在目录中创建子makefile,并使用这些命令将g ++编译的文件输出到您想要的目录中。 (使用makefile变量等...)

您将在递归Makefiles here

上找到一个很好的介绍

Makefile允许您使用一些通用规则,如:

%.o:%.cpp
    gcc blahblahblah

并且您还可以使用include包含来自其他人的全局makefile。

如果你也是谷歌makefile,你会发现很多关于这个主题的方法。