我正在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
简单。工作做得好......现在。我不认为它很优雅,我知道它可能是无用的,因为它会重新编译所有内容,甚至是无法处理的文件。
答案 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 ++源文件或头文件(例如,您自己的awk
或python
脚本,或_timestamp.c
生成的date
文件或者由代码生成器生成的一些C ++文件,如GNU bison或gperf等等......)。然后,您需要将特定的规则添加到Makefile
。
所以在实践中,我不相信完全通用的构建文件,但我试图告诉你Makefile
几乎 通用和短。在某些时候,您将根据您的特定需求进行调整。