`make`没有手动编写Makefile

时间:2016-03-11 10:52:45

标签: c makefile

我今年将有两个人在平原C中写一两个项目。为了自动编译(此外,我还想使用Atom的构建插件)我想要一个Makefile。

但我并不是真的喜欢手动指定所有命令。我宁愿指定源文件和标题(按照正确的顺序),让程序为我构建其余文件。

我可以使用任何工具吗?或者我应该重新考虑手动编写Makefile吗?

2 个答案:

答案 0 :(得分:4)

make有许多隐式规则,它们将在不编写任何命令的情况下从C源文件创建目标文件。您真正需要做的就是列出程序所需的目标文件。

例如,假设您必须提供文件a.cb.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生成依赖项,然后执行正确的编译/绑定。