gpt4 book ai didi

build - 如何使目标依赖于 lib 文件,但将其从 $^ 中排除(涉及 VPATH)?

转载 作者:行者123 更新时间:2023-12-04 03:06:31 25 4
gpt4 key购买 nike

想象一下这个结构:

root/
|
+-- include/
+-- src/
+-- build/
+-- lib/
+-- tests/
|
+-- common
+-- test1
+-- test2
+-- test3

tests/ 中,文件夹 common/ 包含几个源文件,这些文件生成数据或从记录的文件等读取数据,这些文件在所有测试之间共享。因此,每个测试只有一个文件; main.c(当前)。每个测试的 Makefile 如下所示:

.SUFFIXES:
.SUFFIXES: .c .o

TARGET := test
# OS dependent stuff omitted for brevity
CFLAGS += -I../../include -I../common
LDFLAGS += -L../../lib -lname

VPATH = ../common

.phony: all clean
all: $(TARGET)
clean:
-$(RM) *.o $(TARGET)
# Other targets removed for brevity

OBJECTS := main.o io.o read_str.o
$(TARGET): $(OBJECTS) ../../lib/libname.a
$(LD) -o $@ $(OBJECTS) $(LDFLAGS)
%.o: %.c
$(CC) -c $(CFLAGS) -o $@ $<
main.o: main.c io.h $(wildcard ../../include/*.h)

起初我在每个测试中都复制了 common/ 文件,一切都很好,但现在我把它们放在 common/ 中并使用了 VPATH,我遇到了一个问题。

让我解释几行:

main.o: main.c io.h $(wildcard ../../include/*.h)
^^^^
VPATH correctly finds this file in common/

$(TARGET): $(OBJECTS) ../../lib/libname.a
^^^^^^^^^^^^^^^^^^^
If the library is rebuilt, the tests need to re-link

$(LD) -o $@ $(OBJECTS) $(LDFLAGS)
^^^^^^^^^^
I can't use $^ because that also includes ../../lib/libname.a

您可能已经猜到了,由于 common/*.o 文件不在此文件夹中,因此 $(LD) 无法找到它们。另一方面,make,给定 VPATH = ../common 可以毫无问题地找到它们。如果我可以删除 ../../lib/libname.a,然后使用 $^,我可以为目标文件提供正确的路径。

然而,移除对 lib 文件的依赖意味着当我在顶层 make 时,如果只更新 lib 本身,测试将不会更新。

所以,我的问题是,我如何告诉 make 存在对另一个文件(一个 lib 文件)的依赖性,但它没有在它下面的命令中使用,因为使用 VPATH?

找到其他依赖项

我考虑删除依赖项,并在构建 libname.aMakefile 中,在生成库后添加一条命令,告诉 Makefile 的测试以删除它们的 TARGET:

lib/Makefile:

.SUFFIXES:

TARGET = libname.a
VPATH = ../build

.PHONY: all clean
all: $(TARGET)
clean:
-$(RM) $(TARGET)

$(TARGET): list.o of.o my.o library.o files.o
$(AR) $(TARGET) $^
@$(MAKE) --no-print-directory -C ../tests remove_targets

这将迫使 $(LD) 再次制作它们。然而,这种解决方案往往会使 Makefile 关系变得一团糟。构建 lib 的 Makefile 与是否有测试无关,我更愿意将它们解耦。


我构建和测试了很多,这就是为什么我尝试让依赖项完整,以便 make 采取尽可能少的操作来正确构建所有内容。每次都清理和重建的解决方案不是一种选择。

我也知道 this syntax ,如果我想将 lib 文件目录提供给 gcc,而不是使用 -Lpath/to/lib -lname,则可以使用它。但是我不确定这是否是个好主意(我的意思是,我总是看到与 -L 的链接,我不确定直接提供库文件是否有缺点)

顺便说一下,如果我做错了什么可怕的事情,或者如果我让自己太难了,请告诉我应该如何正确完成。

最佳答案

So, my question is, how can I tell make there is a dependency to another file (a lib file) but it is not used in the command below it, given that the other dependencies are found using VPATH?

问题是“我怎样才能使 LIB 成为先决条件但又不在所有先决条件的列表中?”

这可能不是最佳答案,但应该可以,只需将其从列表中过滤掉即可:

$(TARGET): $(OBJECTS) ../../lib/libname.a
$(LD) -o $@ $(filter-out ../../lib/libname.a,$^) $(LDFLAGS)

关于build - 如何使目标依赖于 lib 文件,但将其从 $^ 中排除(涉及 VPATH)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11078582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com