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

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

本文关键字:构建 脚本 简单 C++ 项目      更新时间:2023-10-16

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

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

一般来说,我的意思是我不想硬编码文件名,这样当我将新的.cpp文件放入项目中时,我就不必修改构建脚本。它应该找到并编译当前目录中所有修改后的源文件,并将对象文件链接到可执行文件中。没什么了。

我不在乎你们会用什么工具,因为我还不知道。

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

我尝试了什么

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")

它是从某个StackOverflow答案复制的,但它显然是从一个源文件构建可执行文件的,因为当我想使用它时,会出现链接器错误。

我用bash:结束了我们

g++ -Wall *.cpp

很简单。工作做得好。。。目前。我不认为它是优雅的,我知道它可能是无效的,因为它重新编译了所有东西,甚至是未修改的文件。

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

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)

阅读GNU make的文档,并尝试make -p来查找内置规则。参见Makefile-s的这两个例子:this&

相反,如果您想要从所有的*.cpp文件(如foo.cpp&bar.cpp等(中获得一个单独的可执行文件myprogram,您仍然可以在Makefile中使用$(wildcard *.cpp)(您最好不要将a.out命名为可执行文件,而是将其命名为更有意义的文件(,例如(在上面CXXFLAGS=等常见内容的添加中(:

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

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

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

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

SRC := $(wildcard src/*.c)
DEP := $(SRC:src/%.c=lib/%.d)
OBJ := $(SRC:src/%.c=lib/%.o)
CFLAGS := -Wall -Wextra -O2 -MMD
# Executable
lib/mines: lib/assets.o $(OBJ)
    ${CC} $^ -o $@
# Object files
lib/%.o:: src/%.c
    ${CC} -c $< -o $@ ${CFLAGS}
# Dependencies
# http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
-include $(DEP)
.PHONY: clean
clean:
    rm lib/*