首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建库的旧Makefile不再在FreeBSD下工作

构建库的旧Makefile不再在FreeBSD下工作
EN

Stack Overflow用户
提问于 2018-09-27 00:06:42
回答 1查看 87关注 0票数 3

最近我没有做太多的C编程,但是最近我重新访问了一个旧项目,发现在FreeBSD下构建库的旧Makefile已经不再工作了。下面是一个非常简化的Makefile版本,它曾经工作过:

代码语言:javascript
复制
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程序来配合它:

代码语言:javascript
复制
/* test.c */
#include <stdio.h>

int
test(char const *text)
{
    printf("%s\n", text);
    return 1;
}

它看起来像Makefile指令依赖项:

代码语言:javascript
复制
$(LIBTEST): $(LIBTEST)($(LIBOBJ))

不再起作用了。其结果是:

代码语言:javascript
复制
 ar -crD libTest.a
 rm -f

我一直在研究“男人制造”,但没有成功。

有一件事让我感到困惑,那就是‘人制造’说“关于制造和制作文件的更全面的描述,请参考PMake -一个教程。”

这个准确吗?我当时的印象是,在最近版本的FreeBSD中,pmake被bsdmake所取代--这是我问题的根源吗?

注:我不感兴趣的答案归结为“您可以很好地使用GNU”--这是FreeBSD make的一个问题。

EN

回答 1

Stack Overflow用户

发布于 2018-10-03 17:50:21

代码语言:javascript
复制
$(LIBTEST): $(LIBTEST)($(LIBOBJ))

建议$(LIBTEST) (此处libTest.a)的先决条件是该存档的$(LIBOBJ) (此处test.o)成员,我不太确定make应该从中得出什么结论,但对于我(FreeBSD 11.0),它提出了all (实际上意味着libTest.a)已经是最新的了(另见标尺下面的一个示例)。将行更改为:

代码语言:javascript
复制
$(LIBTEST): $(LIBOBJ)

这似乎是有意义的(除非我遗漏了一些东西,应该是您想要的),对象文件是库目标的先决条件,并且规则用比目标更新的所有先决条件更新库($?)。

这就引出了我的另一条评论。这个rm看起来不仅是不必要的,而且实际上是有害的,因为它意味着test.o总是在调用make all时重新编译,而且库总是被更新,即使没有源(test.c)更改,因为中间的先决条件目标并不存在(即过时)。

即使我解决了周围的所有问题,并将Makefile去掉到最低限度,我也会做出这种行为:

代码语言:javascript
复制
$ ls
Makefile        test.c
$ cat Makefile 
libTest.a: libTest.a(test.o)
        $(AR) $(ARFLAGS) $@ $?
$ make
`libTest.a' is up to date.
$ ls
Makefile        test.c
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52527596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档