今天在 OpenWRT 上增加了个 package, 编译的时候,报出如下错误:
Package test_modules is missing dependencies for the following libraries:
libcrypto.so.1.0.0
libssl.so.1.0.0
在编译目录及最终输出目录都是可以找到这两个文件的,那为什么会出现这个问题呢?
既然有上面的提示,那么就找一下这个提示从哪来吧:
# shujun@server in ~/OpenWRT [16:21:20] [/dev/pts/9]
$ grep -rn "missing dependencies for the following libraries" .
./include/package-ipkg.mk:74: echo "Package $(1) is missing dependencies for the following libraries:" >&2; \
来看一下这个文件的 74 行:./include/package-ipkg.mk
上面这段脚本的功能是:
那么,$(1).provides 又是哪些文件呢,里面的内容又是怎么来的呢?
还是在这个文件里,只要搜一下 CheckDependencies 就能找到位置:
由以上 3 个来源形成的一系列文件名经过 sort -u 排序并删除冗余条目后,写到 $(1).provides 文件里!
至此,$(1).provides的内容,我们就知道了。
那如何解决这个 依赖文件missing 的问题呢,相对的当然也有 3 个方法来解决:
方法1. 在目标package的目录里面,放入缺失的文件,如这个问题中的 libcrypto.so.1.0.0,libssl.so.1.0.0
# 找到那两个文件的位置,并 copy 到 目标package中
cp ./staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/usr/lib/libssl.so.1.0.0 ./package/test_modules/files/
cp ./staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/usr/lib/libcrypto.so.1.0.0 ./package/test_modules/files/
方法2. 让模式 "patsubst %,$(PKG_INFO_DIR)/%.provides,$$(IDEPEND_$(1))" 包含我们需要的文件:
其中 $(PKG_INFO_DIR) 目录是指 staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/pkginfo,当然不同的SDK可能也不一样,这只需要通过 `find . -name "*.provides"` 即可找到。
关键是 $$(IDEPEND_$(1)) 代表了什么,还是在同一个文件中:./include/package-ipkg.mk,在其中搜索一下 IDEPEND_$(1) 就可以找到位置,如下图所示:
实际上 $$(IDEPEND_$(1)) 的值来源于 $$(DEPENDS) 的值,而 $$(DEPENDS) 的值就是 $(DEPENDS),而这个值就是我们在 Makefile中的那个 Package/test_modules 节中定义的 DEPENDS 变量,这个变量其实就是指定了 *.provides 文件名的前面部分。
那到底是哪个文件名呢?
通过上面内容,我们知道,这些文件是在这个位置:$(PKG_INFO_DIR)/%.provides
通过搜索,我们能找到 PKG_INFO_DIR 是定义在 OpenWRT 根目录下的 rules.mk 文件中的
...
TARGET_DIR_NAME = target-$(ARCH)$(ARCH_SUFFIX)$(DIR_SUFFIX)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX))
...
STAGING_DIR:=$(TOPDIR)/staging_dir/$(TARGET_DIR_NAME)
...
PKG_INFO_DIR := $(STAGING_DIR)/pkginfo
在我的环境里,这个目录是: OpenWRT/staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/pkginfo
进到这个目录里,我们找一下哪些文件包含了 缺失的 libcrypto.so.1.0.0, libssl.so.1.0.0
# shujun@server in ~/OpenWRT [20:26:49] [/dev/pts/1]
$ cd staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/pkginfo
# shujun@server in ~/OpenWRT/staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/pkginfo [20:26:52] [/dev/pts/1]
$ grep libcrypto.so.1.0.0 *
...
git.provides:libcrypto.so.1.0.0
libopenssl.provides:libcrypto.so.1.0.0
monit.provides:libcrypto.so.1.0.0
...
# shujun@server in ~/OpenWRT/staging_dir/target-aarch64_cortex-a53+neon_glibc-2.19/pkginfo [20:27:09] [/dev/pts/1]
$ grep libssl.so.1.0.0 *
...
git.provides:libssl.so.1.0.0
libopenssl.provides:libssl.so.1.0.0
monit.provides:libssl.so.1.0.0
...
发现确实已经有一些文件包含这两个库了,我们挑一个比较”正确“的文件,比如那个 libopenssl.provides
找到了这个,那接下来,只需在 Makefile 中的那个 Package/test_modules 节中修改 DEPENDS 变量即可:
方法3. 在目标package的 Makefile 里增加一节: $(Package/$(1)/extra_provides), 示例如下:
# 文件 OpenWRT/package/test_modules/Makefile 中加入下面一节
# 需要注意的是:中间的命令只能写在一行,否则会有 Makefile 语法错误出来
define Package/test_modules/extra_provides
echo libcrypto.so.1.0.0; echo libssl.so.1.0.0;
endef