OpenWRT编译错误:Package missing dependencies for the following libraries

发现问题:

今天在 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

OpenWRT编译错误:Package missing dependencies for the following libraries_第1张图片

上面这段脚本的功能是:

  1. 删除 $(1).missing 文件,这个文件存在即代表有不满足的依赖
  2. 调用 ./scripts/gen-dependencies.sh 生成依赖,动作是 gen-dependencies.sh 会扫描 package里面所有的可执行文件,并将这些文件通过 readelf 和 objcopy 命令将它们所需要的依赖库都提取出来,结果是一个个的 so 文件名
  3. 这些 so 文件名通过管道送给 while 循环,在 while 循环里,grep命令把这些文件名一个一个在 $(1).provides 里面找,如果找到那么没事,如果没找到,那就说明这个文件是 missing 的,要放到 $(1).missing文件里
  4. while 结束之后,检查 $(1).missing 是否存在,如果有这个文件,那么输出编译错误,同时打印出 $(1).missing 的内容,用于提示是哪些 so 文件被丢了,当然,编译到此失败!

那么,$(1).provides 又是哪些文件呢,里面的内容又是怎么来的呢?

还是在这个文件里,只要搜一下 CheckDependencies 就能找到位置:

OpenWRT编译错误:Package missing dependencies for the following libraries_第2张图片从上面可以看到,$(1).provides的来源有 3 个

  1. 目标package的目录里面,由 find 命令找到的所有 lib*.so 及 *.ko 文件
  2. 匹配这个模式 "patsubst %,$(PKG_INFO_DIR)/%.provides,$$(IDEPEND_$(1))" 的所有文件,这些文件的内容
  3. 由命令 $(Package/$(1)/extra_provides) 输出

由以上 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) 就可以找到位置,如下图所示:

OpenWRT编译错误:Package missing dependencies for the following libraries_第3张图片

实际上 $$(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 变量即可:

OpenWRT编译错误:Package missing dependencies for the following libraries_第4张图片

方法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

 

End.

你可能感兴趣的:(OpenWRT)