最近我没有做太多的C编程,但是最近我重新访问了一个旧项目,发现在FreeBSD下构建库的旧Makefile已经不再工作了。下面是一个非常简化的Makefile版本,它曾经工作过:
TEST = Test
LIBTEST = lib$(TEST).a
CC = cc
.PRECIOUS: $(LIBTEST)
all: $(LIBTEST)
LIBSRC = test.c
# Do not automatically delete library source files
.SECONDARY: $(LIBSRC)
LIBOBJ = $(LIBSRC:%.c=%.o)
$(LIBTEST): $(LIBTEST)($(LIBOBJ))
$(AR) $(ARFLAGS) $@ $?
rm -f $?
clean:
@rm -f *.o $(LIBTEST)下面是一个简单的C程序来配合它:
/* test.c */
#include <stdio.h>
int
test(char const *text)
{
printf("%s\n", text);
return 1;
}它看起来像Makefile指令依赖项:
$(LIBTEST): $(LIBTEST)($(LIBOBJ))不再起作用了。其结果是:
ar -crD libTest.a
rm -f我一直在研究“男人制造”,但没有成功。
有一件事让我感到困惑,那就是‘人制造’说“关于制造和制作文件的更全面的描述,请参考PMake -一个教程。”
这个准确吗?我当时的印象是,在最近版本的FreeBSD中,pmake被bsdmake所取代--这是我问题的根源吗?
注:我不感兴趣的答案归结为“您可以很好地使用GNU”--这是FreeBSD make的一个问题。
发布于 2018-10-03 17:50:21
$(LIBTEST): $(LIBTEST)($(LIBOBJ))建议$(LIBTEST) (此处libTest.a)的先决条件是该存档的$(LIBOBJ) (此处test.o)成员,我不太确定make应该从中得出什么结论,但对于我(FreeBSD 11.0),它提出了all (实际上意味着libTest.a)已经是最新的了(另见标尺下面的一个示例)。将行更改为:
$(LIBTEST): $(LIBOBJ)这似乎是有意义的(除非我遗漏了一些东西,应该是您想要的),对象文件是库目标的先决条件,并且规则用比目标更新的所有先决条件更新库($?)。
这就引出了我的另一条评论。这个rm看起来不仅是不必要的,而且实际上是有害的,因为它意味着test.o总是在调用make all时重新编译,而且库总是被更新,即使没有源(test.c)更改,因为中间的先决条件目标并不存在(即过时)。
即使我解决了周围的所有问题,并将Makefile去掉到最低限度,我也会做出这种行为:
$ ls
Makefile test.c
$ cat Makefile
libTest.a: libTest.a(test.o)
$(AR) $(ARFLAGS) $@ $?
$ make
`libTest.a' is up to date.
$ ls
Makefile test.chttps://stackoverflow.com/questions/52527596
复制相似问题