我今年将有两个人在平原C中写一两个项目。为了自动编译(此外,我还想使用Atom的构建插件)我想要一个Makefile。
但我并不是真的喜欢手动指定所有命令。我宁愿指定源文件和标题(按照正确的顺序),让程序为我构建其余文件。
我可以使用任何工具吗?或者我应该重新考虑手动编写Makefile吗?
答案 0 :(得分:4)
make
有许多隐式规则,它们将在不编写任何命令的情况下从C源文件创建目标文件。您真正需要做的就是列出程序所需的目标文件。
例如,假设您必须提供文件a.c
和b.c
,并且您想创建程序p
。,那么您只需要
p : a.o b.o
$(CC) $^ -o $@
$(CC)
是用于C编译器前端程序的变量,也用于链接。 make
为您创建此内容,通常为cc
。
$^
是规则的所有必备条件的列表,在本例中为a.o b.o
。
$@
是规则目标的名称,在本例中为p
。
使用这个非常简单的makefile,make
会将C源代码编译为目标文件,然后使用提供的规则将目标文件链接到可执行程序中。
通过设置make
变量,您可以从上面的makefile开始自定义,例如告诉gcc
明确使用cc
代替CC
。或者通过创建和设置CFLAGS
变量来设置特殊的编译器标志。将目标添加到"清理" (通常删除程序和目标文件)。还有更多。
我建议您了解make
和makefile,为此,您应该先阅读the GNU make online manual,然后再转到其他构建系统。
GNU build system仍然很常见,但它最近一直在失势,主要是CMake(我个人赞成),但还有很多其他的构建系统。有些(比如CMake)可用于生成makefile,而有些则是make
的直接替换。
答案 1 :(得分:1)
这应该被视为Joachims关于如何将它们串在一起的答案的补充。
我有一个makefile,我或多或少地使用它,它具有自动依赖项发现和自动源文件发现。 虽然可能不适合大型项目,但我发现小型原型和程序非常方便。
我在这里收集并评论了重要部分:
CC:=gcc # Define the Compiler
CFLAGS:=-O2 -g # Define the Compiler Options
SRC_DIR:=src # Source is in this folder
BIN_DIR:=bin # objects will be places in this folder
# Discover all C files
SRC:=$(shell find $(SRC_DIR) -type f -name *.c)
# Every C file is compiled into one object file
OBJ:=$(addprefix bin/,$(notdir $(patsubst %.c,%.o,$(C_SRC))))
# Every C file creates a dependency file
DEP:=$(patsubst %.c,%.d,$(C_SRC)
# Include the dependencies
-include $(DEP)
all: executable
# Bind all objects into the executable
executable: $(OBJ)
$(CC) $^ -o executable
# Recipe to create the dependencie files from the source files
.d: %.c
$(CC) -MM -MT"$(BIN_DIR)/$(notdir $(<:.c=.o))" -MF "$@" "$<"
# Recipe to do the compilation
$(C_OBJ):bin/%.o:
-$(STYLEC) $^
$(CC) $(CFLAGS) -c -o $@ $<
这将从src /文件夹中获取所有源文件,使用gcc生成依赖项,然后执行正确的编译/绑定。