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

时间:2015-09-26 15:38:48

标签: c++ build build-process

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

我希望有一些尽可能简单的通用构建脚本。

通用,我的意思是我不想对文件名进行硬编码,因此当我将新的.cpp文件放入项目时,我不必修改构建脚本。它应该在当前目录中查找并编译所有modyfied源文件,并将目标文件链接到可执行文件。没什么。

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

我不想从基础知识中学习一种简单的工具。现在,我只需要一个代码,我会在需要更多花哨的东西时学习。

我尝试了什么

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

简单。工作做得好......现在。我不认为它很优雅,我知道它可能是无用的,因为它会重新编译所有内容,甚至是无法处理的文件。

1 个答案:

答案 0 :(得分:2)

我猜你有一个充满单源C ++程序的目录(例如每个程序都有一个C ++源文件)名为.cpp(例如foo.cpp& bar.cpp),每个独立编译为可执行文件(例如foo& bar)。您可以针对GNU Makefile尝试以下(未经测试的)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并尝试make -p查找内置规则。另请参阅Makefile - s的这两个示例:this& that

如果恰恰相反,您需要所有myprogram个文件(例如*.cpp& foo.cpp等)中的一个可执行文件bar.cpp,您仍然可以在$(wildcard *.cpp)中使用Makefile(最好不要将a.out命名为可执行文件,而是更有意义的内容),例如(在添加中的常见内容)如上面的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脚本,或_timestamp.c生成的date文件或者由代码生成器生成的一些C ++文件,如GNU bisongperf等等......)。然后,您需要将特定的规则添加到Makefile

所以在实践中,我不相信完全通用的构建文件,但我试图告诉你Makefile几乎 通用和短。在某些时候,您将根据您的特定需求进行调整。