GNU make 管理C/C++项目

预计时间: 3分钟

预定义的隐式规则

GNU makefile 有一个预定义的隐式规则目录,这些规则总是可用的,除非 makefile 显式地覆盖或取消它们。

隐式规则基于文件的扩展名,默认支持的扩展名列表: .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .lm .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el

隐式规则使用的变量

下面是一些在内置规则中用作程序名的变量表。

  • CC 编译C程序,默认值 cc
  • CXX 编译C++程序,默认值 g++
  • CPP 运行C预处理器,默认 $(CC) -E

下面是上述程序的附加参数的变量表,默认值都是空字符串,除非另有说明。

  • CFLAGS 是C编译器程序的附加参数
  • CXXFLAGS 是C++编译器程序的附加参数
  • CPPFLAGS 给C预处理器和使用它的程序(C和Fortran编译器)的附加参数。

编译链接C程序

编译目标 n.o,先决条件 n.c

$(CC) $(CPPFLAGS) $(CFLAGS) -c

链接目标 n,先决条件 n.o

$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

编译链接C++程序

编译目标 n.o,先决条件 n.ccn.cppn.c

如果是C++源文件,推荐用 n.cc代替n.c

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

练习 1

在一个临时空目录下创建 hello.c 内容如下

int main()
{
  return 0;
}

在没有 Makefile 的情况下执行 make 命令

macOS下执行 make hello 显示

cc     hello.c   -o hello

Linux下执行 make hello 显示

cc     hello.c   -o hello

练习 2

在一个临时空目录下创建 hello.cpp 文件内容如下

int main()
{
  return 0;
}

macOS下执行 make hello 显示

c++     hello.cpp   -o hello

Linux下执行 make hello 显示

g++     hello.cpp   -o hello

练习 3

创建 Makefile 内容如下,只覆盖编译程序参数

CFLAGS=-Wall -g
CXXFLAGS=-Wall -g

练习 4

将以下内容保存为 Makefile,然后执行 make 命令。

hello: hello.o
	cc hello.o -o hello # 第三步

hello.o: hello.c
	cc -c hello.c -o hello.o # 第二步

hello.c:
	echo "int main() { return 0; }" > hello.c # 第一步

注意用tab,不要用空格

touch hello.c 命令改变文件修改时间,再次执行 make 命令。

编辑 hello.c 文件内容再次执行 make 命令。

参考资料

更新于2022年04月11日