【问题标题】:Using file name to get gnu make prerequisites使用文件名获取 gnu make 先决条件
【发布时间】:2021-04-09 18:56:37
【问题描述】:

根据共享库名称,我想自动确定要包含在 make 配方中的 SRCS。

SHARED_LIBS  := libc.so \
                libd.so

libc.so,SRCS  := a.o \
                 b.o
libc.so,DEPS  := -lc

libd.so,SRCS  := e.o \
                 f.o
libd.so,DEPS  := -lc


all: $(SHARED_LIBS)
.PHONY: all

%.o: %.c
    $(CC) -c $^ -o $@ 

%.so: $($*.so,SRCS)
    $(CC) $(CFLAGS) $(SFLAGS) -o $@ $^ $($*,DEPS)

【问题讨论】:

  • 你能说得更具体一点吗?该makefile与问题有何关系?该 makefile 的预期结果是什么?
  • 您似乎有一个特定的库命名约定;如果您告诉我们它是什么,也许我们可以为您提供建议。
  • 基本上你在哪里看到 %.so 目前我需要使用 $(libc.so,SRCS) 或 $(libd.so,SRCS) 但我希望它能够根据共享自动抓取那些库名称。

标签: c linux makefile gnu


【解决方案1】:

您所拥有的几乎可以工作:DEPS 将工作(如果您使用正确的名称)。

为了清楚起见,我重命名了库,因为您绝对不应该创建名为 libc 的库。

如果你可以放弃对象列表应该在变量中的想法,而是直接声明它们,你可以很容易地做你想做的事:

SHARED_LIBS  := libfoo.so

all: $(SHARED_LIBS)
.PHONY: all

libfoo.so: a.o \
           b.o

libfoo,DEPS := -lc

%.o: %.c
        $(CC) -c $^ -o $@ 

%.so:
        $(CC) $(CFLAGS) $(SFLAGS) -o $@ $^ $($*,DEPS)

应该这样做。当然,您不需要将-lc 显式添加到您的链接行,而且您可能不应该这样做。但大概您还有其他要添加的库。

如果您真的希望将对象也存储在变量中,那么您需要做一些更花哨的事情。

【讨论】:

  • 这似乎不起作用。我看到生成了 .o 文件,但没有看到 libfoo.so 生成。
  • 需要进行一项小改动(移动all 目标),但仍会构建libfoo.so。抱歉,如果您使用上面的 makefile 并运行 make,那么您报告的行为(libfoo.so 未生成)就不会发生,因此您的环境中一定有其他方面您没有在这里描述。您可以尝试运行 make -d 并检查(大量)输出以确定 make 如何决定处理 libfoo.so 目标。
  • 我知道问题中包含%.o: %.c 规则,但这并不是真正需要的,是吗?
  • 如果内置规则足以满足他们的目的,则不需要。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多