在Ubuntu系统中,使用GCC编译C或C++程序时,编写一个Makefile可以帮助自动化编译过程。以下是一个简单的Makefile示例,以及如何使用它来编译一个C程序。
首先,假设你有一个名为hello.c
的C源文件,内容如下:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
接下来,创建一个名为Makefile
的文件,内容如下:
# 编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -g
# 目标文件
TARGET = hello
# 源文件
SRCS = hello.c
# 对象文件
OBJS = $(SRCS:.c=.o)
# 默认目标
all: $(TARGET)
# 链接目标文件生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
# 编译源文件生成对象文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 清理生成的文件
clean:
rm -f $(OBJS) $(TARGET)
编译器和编译选项:
CC = gcc
CFLAGS = -Wall -g
CC
变量指定了使用的编译器,这里是gcc
。CFLAGS
变量包含了编译选项,-Wall
表示显示所有警告,-g
表示包含调试信息。
目标文件和源文件:
TARGET = hello
SRCS = hello.c
OBJS = $(SRCS:.c=.o)
TARGET
变量指定了最终生成的可执行文件的名称。SRCS
变量列出了所有的源文件。OBJS
变量通过替换.c
为.o
,自动生成了对象文件的列表。
默认目标:
all: $(TARGET)
all
是默认目标,表示当你运行make
命令时,默认会编译生成$(TARGET)
。
链接目标文件生成可执行文件:
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
这条规则表示如何从对象文件生成最终的可执行文件。
编译源文件生成对象文件:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
这条规则使用了模式匹配,%.o: %.c
表示任何.o
文件都可以通过对应的.c
文件编译生成。$<
表示第一个依赖文件,$@
表示目标文件。
清理生成的文件:
clean:
rm -f $(OBJS) $(TARGET)
clean
目标用于删除所有生成的对象文件和可执行文件,以便重新编译。
将上述内容分别保存到hello.c
和Makefile
文件中。
在终端中导航到包含这两个文件的目录。
运行以下命令来编译程序:
make
这将生成一个名为hello
的可执行文件。
运行生成的可执行文件:
./hello
你应该会看到输出:
Hello, World!
如果你想清理生成的文件,可以运行:
make clean
通过这种方式,你可以轻松地管理和编译多个源文件的项目。