许多c ++可执行文件的Makefile

时间:2019-02-14 16:11:40

标签: c++ makefile gnu-make

我正在一个项目中,我经常需要创建新的c ++可执行文件。它们都依赖于一些常见的头文件和源文件,因此我想知道如何简化编译和Makefile的编写。 到目前为止,我想出的最好的方法是这样的:

file1: $(BUILDDIR)/$@.o $(COMMON_OBJECTS) $(COMMON_LIBS)
    $(CCCOM) $(CCFLAGS) $(BUILDDIR)/$@.o $(COMMON_OBJECTS) -o $(BINDIR)/$@ $(LIBFLAGS)

,然后我必须为每个要添加的可执行文件复制此目标。理想情况下,我想为任意目标定义一次此规则,然后只需调用make any_file_name

有可能这样吗? 人们如何组织具有大量可执行文件的c ++项目? (我是C ++的新手,来自python,这是很自然的事情)

3 个答案:

答案 0 :(得分:0)

您可以 进行设置,以使每个可执行文件都对应一个目录中的单个.cpp文件(例如executables/foo.cppexecutables/bar.bpp),然后从在那里-这样可以避免您每次添加另一个Makefile时都需要碰触。

您可能还应该设置项目以创建一个共享库,(轻量级)可执行文件链接到该共享库。 (可执行文件实际上只是进行了一些命令行解析,然后将实际工作转移到库函数中。)通过这种方式,您将不会得到在每个可执行文件中复制的$(COMMON_OBJECTS)中的代码。

答案 1 :(得分:0)

以下是一个示例文件,该文件具有为您自动生成标头依赖项的功能:

BUILD := debug
BUILD_DIR := ${BUILD}

CXX := g++

cppflags.debug :=
cppflags.release := -DNDEBUG
cppflags := ${cppflags.${BUILD}} ${CPPFLAGS}

cxxflags.debug :=
cxxflags.release := -O3
cxxflags := ${cxxflags.${BUILD}} ${CXXFLAGS}

ldflags := ${LDFLAGS}
ldlibs := ${LDLIBS}

exes := # Executables to build.

### Define executables begin.

exes += exe1
exe1.obj := exe1.o

exes += exe2
exe2.obj := exe2.o

### Define executables end.

all : ${exes:%=${BUILD_DIR}/%}

.SECONDEXPANSION:

${BUILD_DIR}:
    mkdir -p $@

# Rule to link all exes.
${exes:%=${BUILD_DIR}/%} : ${BUILD_DIR}/% : $$(addprefix ${BUILD_DIR}/,$${$$*.obj}) | $${@D}
    ${CXX} -o $@ ${ldflags} $^ ${ldlibs}

# Rule to compile C sources. And generate header dependencies.
${BUILD_DIR}/%.o : %.cc | $${@D}
    ${CXX} -o $@ -c ${cppflags} ${cxxflags} -MD -MP $<

# Include automatically generated header dependencies.
ifneq ($(MAKECMDGOALS),clean)
-include $(foreach exe,${exes},$(patsubst %.o,${BUILD_DIR}/%.d,${${exe}.obj}))
endif

clean:
    rm -rf $(BUILD_DIR)

.PHONY: all clean

用法示例:

$ cat exe1.cc 
#include <iostream>
int main() { std::cout << "Hello, world!\n"; }

$ cat exe2.cc 
#include <iostream>
int main() { std::cout << "Hello, world!\n"; }

$ make
mkdir -p debug
g++ -o debug/exe1.o -c     -MD -MP exe1.cc
g++ -o debug/exe1  debug/exe1.o 
g++ -o debug/exe2.o -c     -MD -MP exe2.cc
g++ -o debug/exe2  debug/exe2.o 

$ make BUILD=release 
mkdir -p release
g++ -o release/exe1.o -c -DNDEBUG  -O3  -MD -MP exe1.cc
g++ -o release/exe1  release/exe1.o 
g++ -o release/exe2.o -c -DNDEBUG  -O3  -MD -MP exe2.cc
g++ -o release/exe2  release/exe2.o 

$ make clean
rm -rf debug

$ make BUILD=release clean
rm -rf release

答案 2 :(得分:0)

为简化所有操作,我假设您具有源file1.cppfile2.cpp等,并且所有文件都位于同一目录中。然后,下面的Makefile片段将执行您想要的操作:

all: $(basename $(wildcard file?.cpp))

file%: file%.cpp

使一切变得如此:

make all

制作file1

make file1

制作file1file2

make file1 file2