c - 如何告诉 Make 忽略尚未更新的文件?
问题描述
我是使用 Make 的新手,但在弄清楚语法时遇到了一些麻烦。我浏览了一些示例,我基本上将其中的一些组合起来创建了我自己的文件。我不确定如何告诉 make 忽略已编译的源文件或未更改的头文件。如何让 make 只编译已更改的文件?
我查看了 GNU 网站:https ://www.gnu.org/software/make/manual/html_node/Avoiding-Compilation.html
我尝试了其中一些标志,但我仍然没有得到我想要的结果。
# specify compiler
CC=gcc
# set compiler flags
CFLAGS=-Igen/display -Igen/logic -Iman -Ilib/include -pipe -march=native
# set linker flags
LDFLAGS=-lglut32 -loglx -lopengl32 -Llib
# include all sources
SOURCES=gen/display/*.c gen/logic/*.c man/*.c
# create objects from the source files
OBJECTS=$(SOURCES:.cpp=.o)
# specify the name and the output directory of executable
EXECUTABLE=win32/demo
all: $(SOURCES) $(EXECUTABLE)
# compile the target file from sources
# $@ = placeholder for target name
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) $(LDFLAGS) -o $@
.c.o:
$(CC) $(CFLAGS) $< -o $@
我在不同的目录中有许多头文件和源文件正在编译,但无论我做什么,一切都会重新编译。
解决方案
好的,让我们这样做,因为它应该这样做;-)
# set up our variables
# note: you may also prefer := or ?= assignments,
# however it's not that important here
CC=gcc
CFLAGS=-Igen/display -Igen/logic -Iman -Ilib/include -pipe -march=native
# linker's flags are different from compiler's
LDFLAGS=
# these are really libs, not flags
LDLIBS=-Llib -lglut32 -loglx -lopengl32
# 1) make is not your shell - it does not expand wildcards by default
# 2) use := to force immediate wildcard expansion;
# otherwise make could perform it several times,
# which is, at the least, very ineffective
SOURCES:=$(wildcard gen/display/*.c gen/logic/*.c man/*.c)
# use the right extensions here: .c -> .o
OBJECTS=$(SOURCES:.c=.o)
# note: it's okay to omit .exe extension if you're using "POSIX"-like make
# (e.g. cygwin/make or msys/make). However, if your make was built on Windows
# natively (such as mingw32-make), you'd better to add '.exe' here
EXECUTABLE=win32/demo
# don't forget to say to make that 'all' is not a real file
.PHONY: all
# *.c files are what you write, not make
# note: in fact, you don't need 'all' target at all;
# this is rather a common convention
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
# note: 1) suffix rules are deprecated; use pattern rules instead
# 2) this doesn't add much to the built-in rule, so you can even omit it
# 3) .o files are created in the same directories where .c files reside;
# most of the time this is not the best solution, although it's not
# a mistake per se
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
推荐阅读
- twitter-bootstrap - 从 Vuejs 中的同级组件打开 Bootstrap 模态
- javascript - 使用 Jest 测试超类调用
- node.js - node express - 加载类的毫秒数
- docker - 从节点 js 应用程序容器连接 localstack docker 容器
- powershell - Powershell 脚本 - 错误控制并确保数组工作流中的项目顺序
- javascript - 动态添加和删除输入并更新嵌套数组
- python - 您如何汇总列表中的所有值并以有组织的方式打印最终项目及其最终值?
- sql - 查找时间段内的最大重叠间隔
- reactjs - (反应)无法在反应生命周期方法之外连接到 websocket
- python - Kivy 如何在 Spinner 中添加更改日期(下拉菜单)