将依赖项添加到库中,并将它们添加到依赖于该库的二进制文件中
add dependencies to a library, and add them to a binary which depends on that library
我有什么:
我有一个非递归的makefile,它搜索module.mk
文件,并包含它们
modules := $(shell find . -name module.mk)
include $(modules)
如果我想创建一个静态库,module.mk
如下所示:
$(eval $(call make-lib, test_lib))
这将找到当前目录中所有.cpp
文件的列表,并调用 do-make-lib
,使用:
-
$1
是库名称 -
$2
是源文件的列表
do-make-lib
定义如下(为简洁起见,省略了一些细节):
define do-make-lib
$(addprefix $(addprefix $(LIB_DIR)lib,$1),.a): $(call src_to_obj, $2)
@$(AR) $(ARFLAGS) $$@ $$?
endef
现在,当我构建二进制文件时,module.mk
如下所示:
$(eval $(call make-bin, test_bin, test_lib))
同样,make-bin
将找到当前目录中所有.cpp
文件的列表,并调用 do-make-bin
,使用:
-
$1
是二进制名称 -
$2
是源文件的列表 -
$3
是要链接的静态库列表
do-make-bin
定义如下:
define do-make-bin
$(addprefix $(BIN_DIR),$1): $(call src_to_obj,$2)
$(addsuffix .a,$(addprefix $(LIB_DIR)lib,$3))))
@$(CXX) $(call src_to_obj,$2)
-L/usr/lib -L$(LIB_DIR)
-Wl$(,)-Bstatic $(addprefix -l,$3)
-o $$@
endef
我的问题:
库依赖于其他库。当我链接二进制文件时,我需要以正确的顺序给出它所依赖的所有库的列表。
$(eval $(call make-bin, my_bin, lib5 lib4 lib3 lib2 lib1))
我想要什么:
我想向make-lib
传递一个附加参数,这是一个依赖项列表
$(eval $(call make-lib, test_lib, lib3 lib2 lib1))
do-make-lib
我可以创建一个变量,其中包含正在构建的库的名称,该变量捕获依赖项
伪代码(不确定语法 - 如何从另一个变量构建变量?
$1_DEPS = $3
然后在构建我的二进制文件时,我可以将库的依赖项作为二进制文件的依赖项包含在内,并将它们添加到链接行中
伪代码(不确定语法)
define do-make-bin
# build a list of dependencies, eg: lib2_DEPS lib2_DEPS lib1_DEPS
$1_DEPS = $(addsuffix _DEPS,$3)
$(addprefix $(BIN_DIR),$1): $(call src_to_obj,$2)
$(addsuffix .a,$(addprefix $(LIB_DIR)lib,$3))
$(addsuffix .a,$(addprefix $(LIB_DIR)lib,$($1_DEPS))))) # include the libs dependencies as dependencies of the binary
@$(CXX) $(call src_to_obj,$2)
-L/usr/lib -L$(LIB_DIR)
-Wl$(,)-Bstatic $(addprefix -l,$3) $(addprefix -l,$($1_DEPS))) # link against dependencies' dependencies
-o $$@
endef
问题:
- 这可行吗?
- 有人可以帮我语法吗?
所以,你有这些定义(比如)
test_lib_DEPS := lib5 lib4 lib3 lib2 lib1
lib5_DEPS := lib6 lib3
lib6_DEPS := lib1
lib2_DEPS := lib1
手动扩展test_lib_DEPS
,我们发现我们首先想要lib5
,然后是$lib5_DEPS
的递归扩展,然后是lib4
和$lib4_DEPS
等。深度优先扩展。
expand = $(foreach _,$1,$_ $(call expand,${$__DEPS}))
$(error [$(call expand,${test_lib_DEPS})])
这给了
$ make
1:9: *** [lib5 lib6 lib1 lib3 lib4 lib3 lib2 lib1 lib1 ]. Stop.
相当不错。您可能希望梳理出这些重复项。 $(sort)
符合要求,但在链接时,您可能希望保留排序。按照类似的参数,我们可以以函数式编写一个uniq
函数:返回参数的第一个元素,然后是递归调用 uniq
,但缺少第一个元素,因为我们已经有了它。
test_lib_DEPS := lib5 lib4 lib3 lib2 lib1
lib5_DEPS := lib6 lib3
lib6_DEPS := lib1
lib2_DEPS := lib1
uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
depth-first = $(foreach _,$1,$_ $(call depth-first,${$__DEPS}))
expand = $(call uniq,$(call depth-first,$1))
$(error [$(call expand,${test_lib_DEPS})])
给
$ make
1:10: *** [lib5 lib6 lib1 lib3 lib4 lib2 ]. Stop.
相关文章:
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 为什么内存屏障依赖于变量?
- 反转依赖于 end() 的迭代器
- 编译依赖于 QTCore 库的 WASM
- 如何添加依赖于类本身的模板成员变量
- 初始化依赖于子类的继承类的常量类成员
- Makefile 创建两个库 - 一个依赖于另一个
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 类成员函数参数列表是否可以依赖于模板参数?
- 依赖于类成员属性的类实例成员
- 如何定义依赖于参数包转换的函数的返回类型
- 依赖于模板的错误
- 依赖于特定类类型的C++模板方法
- FBString 的小字符串优化是否依赖于未定义的行为?
- CMake:如何在Visual Studio环境中将依赖于模式的编译标志传递给nvcc
- C++ 使函数调用依赖于模板参数
- 如何初始化依赖于先前条目的可变参数模板?
- 依赖于参数的名称查找:添加要查找的额外命名空间
- 将依赖项添加到库中,并将它们添加到依赖于该库的二进制文件中
- 在DLL搜索路径中添加路径以帮助执行依赖于DLL的EXE