如何为 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.cpp
和 bar.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++ 源文件或头文件(例如,您自己的 awk
或 python
脚本,或使用 date
,或一些由代码生成器生成的 C++ 文件,如 GNU bison or gperf,等等……)。然后您需要将 specific 规则添加到您的 Makefile
.
所以在实践中,我不相信 完全通用的 构建文件,但我试图向您展示 Makefile
可以几乎 通用且简短。有时您会根据自己的特殊需要调整它。
我正在编写由 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.cpp
和 bar.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++ 源文件或头文件(例如,您自己的 awk
或 python
脚本,或使用 date
,或一些由代码生成器生成的 C++ 文件,如 GNU bison or gperf,等等……)。然后您需要将 specific 规则添加到您的 Makefile
.
所以在实践中,我不相信 完全通用的 构建文件,但我试图向您展示 Makefile
可以几乎 通用且简短。有时您会根据自己的特殊需要调整它。