gpt4 book ai didi

c++ - makefile 库依赖 - 解决循环依赖

转载 作者:行者123 更新时间:2023-11-30 05:42:05 30 4
gpt4 key购买 nike

我正在尝试在我的 makefile 中构建一个功能,它允许我指定一个特定库依赖

的库列表

这将允许在库的依赖项被重建时自动重建库的依赖项,并将依赖项添加到链接行。

我在 SO here 上问了一个相关问题,并通过给定的答案,我想出了以下测试

uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
expand-deps = $1 $(foreach _,$1, $(call expand-deps,$($__deps)))
make-dep-list = $(call uniq,$(call expand-deps,$1))

define make-lib
$(warning $1_deps: $2)
# capture the list of libraries this library depends on
$1_deps = $2
endef

define make-bin
# show the fully expanded list of libraries this binary depends on
$(warning $1 dep-list: [$(call make-dep-list,$2)])
endef

#$(eval $(call make-lib, thread, log utils)) circular-dependency log->thread; thread->log
$(eval $(call make-lib, thread, utils))
$(eval $(call make-lib, log, thread))
$(eval $(call make-lib, order, log))
$(eval $(call make-lib, price, log))
$(eval $(call make-bin, test, order price))

运行上面的 makefile 会产生以下结果:

$ make
makefile:15: thread_deps: utils
makefile:16: log_deps: thread
makefile:17: order_deps: log
makefile:18: price_deps: log
makefile:19: test dep-list: [order price log thread utils ]
make: *** No targets. Stop.

库有可能有循环依赖。

举个例子:日志库是多线程的,所以需要线程库。线程库可以发出日志语句,所以需要日志库。

如果我取消注释具有循环依赖的行

$(eval $(call make-lib, thread, log utils))
$(eval $(call make-lib, log, thread))

makefile 将陷入无限循环。

如何让用户指定循环依赖,并跳出无限循环?

最佳答案

因此,您的问题是您正在递归扩展 lib_deps(比方说)。在这样做的同时,您再次开始扩展 lib_deps。无限循环(呃,堆栈崩溃)。为了阻止自己,你需要保留一份你已经扩展过的东西的 list 。脱离函数式风格并在全局 expansion 中保留答案(呃!),类似于:

expand-deps = \
$(foreach _,$1, \
$(if $(filter $_,${expansion}),, \
$(eval expansion += $_)$(call expand-deps,${$__deps})))

make-dep-list = $(eval expansion :=)$(call expand-deps,$1)${expansion}

define make-lib
$(warning $1_deps: $2)
# capture the list of libraries this library depends on
$1_deps := $2
endef

define make-bin
# show the fully expanded list of libraries this binary depends on
$(warning $1 dep-list: [$(call make-dep-list,$2)])
endef

$(eval $(call make-lib,thread,log utils))#circular-dependency log->thread; thread->log
#$(eval $(call make-lib,thread,utils))
$(eval $(call make-lib,log,thread))
$(eval $(call make-lib,order,log))
$(eval $(call make-lib,price,log))
$(eval $(call make-bin,test,order price))

(作为练习,您可能希望以函数式风格重写它,即摆脱全局 $expansion,将其替换为可传递的参数。)

关于c++ - makefile 库依赖 - 解决循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30837891/

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