如何为 C++ 项目编写简单的通用构建脚本?

How to write simple generic build script for C++ project?

我正在编写由 Linux 上的几个文件组成的 C++ 项目。该项目没有子目录。

我想要一些尽可能简单的通用构建脚本。

通用的意思是我不想硬编码文件名,这样当我将新的 .cpp 文件放入项目时,我不必修改构建脚本。它应该在当前目录中找到并编译所有修改后的源文件,并将 link 目标文件编译为可执行文件。仅此而已。

我不关心你会使用什么工具,因为我还不知道。

我不想从基础学一个工具来写这么简单的东西。现在,我只需要一个代码,我会在需要更花哨的东西时学习。

我试过的

make:

a.out: %.o
    $(CXX) %.o

%.o: %.cpp
    $(CXX) -Wall -c %.cpp

没有成功:

make: *** Brak reguł do zrobienia obiektu `%.o', wymaganego przez `a.out'. Stop.

我对这条消息的翻译:

make: *** No rules to make object `%.o', required by `a.out'. Stop.

在有人问之前,我会回答:是的,我的 makefile 缩进了 1 个制表符,而不是空格。

make -d打印出664行,这里就不贴了

scons:

Program("main.cpp")

它是从一些 Whosebug 的回答中复制而来的,但它绝对是为了从一个源文件构建一个可执行文件,因为当我想使用它时会遇到 linker 错误。

我结束了使用 bash:

g++ -Wall *.cpp

简单。工作做得好……暂时。我不认为它很优雅而且我知道它可能效率低下,因为它会重新编译所有内容,甚至是未修改的文件。

我猜你有一个充满单一源 C++ 程序的目录(例如,每个程序都有一个单一的 C++ 源文件),名为 .cpp(例如 foo.cpp & bar.cpp) ,每个 独立地 编译为可执行文件(例如 foo & bar)。您可以尝试以下(未经测试)Makefile for GNU make.

CXX= g++
CXXFLAGS= -Wall -Wextra -g -O
RM= rm -vf

SOURCES= $(wildcard *.cpp)
BINARIES= $(patsubst %.cpp, %, $(SOURCES))

.PHONY: all clean

all: $(BINARIES)

clean:
     $(RM) *~ *.o $(BINARIES)

阅读documentation of GNU make and try make -p to find the builtin rules. See also these two examples of Makefile-s: this & that

相反,如果您想要从所有 *.cpp 文件(如 foo.cppbar.cpp 等....)中提取一个可执行文件 myprogram,您仍然可以在你的 Makefile 中使用 $(wildcard *.cpp) (你最好不要命名你的可执行文件 a.out,而是更有意义的东西),比如(在 addition 上面 CXXFLAGS= 之类的常见内容):

SOURCES= $(wildcard *.cpp)
OBJECTS= $(patsubst %.cpp, %.o, $(SOURCES))
all: myprogram
myprogram: $(OBJECTS)
    $(LINK.cc) $^ -o $@ $(LIBES)

在所有情况下,使用 $(wildcard *.cpp) 就足以在来源列表中有一个足够通用的 Makefile。您可能想要生成自动依赖项(使用 gcc -M 东西,对某些 您的 头文件),请参阅 this.

请注意,您可能有一些通过其他方式生成的 C++ 源文件或头文件(例如,您自己的 awkpython 脚本,或使用 date,或一些由代码生成器生成的 C++ 文件,如 GNU bison or gperf,等等……)。然后您需要将 specific 规则添加到您的 Makefile.

所以在实践中,我不相信 完全通用的 构建文件,但我试图向您展示 Makefile 可以几乎 通用且简短。有时您会根据自己的特殊需要调整它。