c - 用 makefile 编译库的成语
问题描述
LIB = lib.a
LIBMEMB = $(LIB)(a.o) $(LIB)(b.o) $(LIB)(c.o)
$(LIB) : $(LIBMEMB)
.c.a:
$(CC) -c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $*.o
rm -f $*.o
由于.c.a
部分与推理规则相同,我认为上面的 makefile 是一种用于制作库的广泛使用的习惯用法。
但是,我在想这种情况:
- 您已经使用上面的 makefile 编译了它,所以
lib.a
文件存在。 - 那么你想改变你的代码结构,或者你不喜欢你的文件名,或者其他什么,所以你将源文件更改为
b.c
d.c
f.c
froma.c
b.c
c.c
.
所以你像这样改变你的makefile:
LIB = lib.a
LIBMEMB = $(LIB)(b.o) $(LIB)(d.o) $(LIB)(f.o)
$(LIB) : $(LIBMEMB)
.c.a:
$(CC) -c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $*.o
rm -f $*.o
然后a.o
andc.o
仍然会在 中lib.a
,但它不应该。由于这是一种常见情况,我认为必须有一些广泛使用的习惯用法来删除未在 makefile 中指定的库成员,但我找不到任何东西。显然,你可以制定clean
规则,比如
clean :
rm -f $(LIB)
并在您更改文件名或删除某些文件等时调用它,但是由于我们编写 makefile 的目的是仅编译更改的内容,因此我认为该解决方案不好。处理这种情况的好方法是什么?
解决方案
推荐阅读
- c# - 在 C# 中仅保留 Regex.Split 的匹配模式
- php - 每次提交表单时返回不同的文本 PHP
- javascript - 带有 vuedraggable 的 Vue typescript 类组件
- ssl - 通过 Let's Encrypt 在 digitalocean droplet 为我的域获取 SSL 证书时出现问题
- awk - 批量更新文本文件中的一行
- android - 未能通过 # 作为拨号应用程序中的输入
- c# - Swagger UI 输出“不支持的媒体类型”
- xamarin - MVVM Xamarin Forms,最适合在等待来自服务调用的几分钟响应时将函数保留在内存中
- amazon-web-services - 在foreach循环中执行powershell命令
- java - Spring ExceptionalHandler 的 Java 测试