如何为C++项目编写简单的通用构建脚本
How to write simple generic build script for C++ project?
我正在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++源文件或头文件(例如,您自己的awk
或python
脚本,或使用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/*
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- 如何通过cpp程序运行shell脚本
- 我适合在我的构建系统中使用 shell 脚本而不是AX_CHECK_COMPILE_FLAG吗?
- Eclipse IDE C/C++ 自动包含来自定制构建脚本的路径
- 如何在构建时改进我的脚本和复制程序资源?
- 在构建之前,如何使Cmake在构建之前运行Python脚本,以生成用于构建中的项目的文件
- MSVC2013:如何避免在错误地使用预构建脚本中止构建过程(错误MSB3073:VCEnd"退出,代码为 -1)
- 可视化 将 c++ 可执行文件图标添加到预制件 5 构建脚本
- 在C 中构建并运行C -C 脚本(而不是LUA)
- 如何构建访问联机脚本的程序
- Shell脚本或c++库,用于查看互联网连接并构建防火墙
- 如何为C++项目编写简单的通用构建脚本
- NDK12b: clang和gcc使用独立的工具链和相同的构建脚本生成不同的ELF
- 为什么Xcode 4.2为.cpp文件应用C文件构建规则脚本?
- 在构建之前在eclipse中运行一个脚本
- 如何运行CMD脚本,而不是构建和启动c++控制台应用程序
- Coverity:基本c++代码的命令行构建脚本