我正在一个项目中,我经常需要创建新的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,这是很自然的事情)
答案 0 :(得分:0)
您可以 进行设置,以使每个可执行文件都对应一个目录中的单个.cpp
文件(例如executables/foo.cpp
,executables/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.cpp
,file2.cpp
等,并且所有文件都位于同一目录中。然后,下面的Makefile
片段将执行您想要的操作:
all: $(basename $(wildcard file?.cpp))
file%: file%.cpp
使一切变得如此:
make all
制作file1
:
make file1
制作file1
和file2
:
make file1 file2