Openwrt Package xxx is missing dependencies for the following libraries 问题分析

Openwrt编译时通常会遇到如下问题:

Openwrt Package xxx is missing dependencies for the following libraries: libxxx.so.*


首先检查package/xxx/Makefile中的DEPENDS是否加入了对应的依赖,如果加入了还出错,可能就是DEPENDS后面加入的库名字不正确


--------------------------------------

一个实例,我编译directfb-examples需要依赖libdirectfb这个库,我编译后提示

Package directfb-examples is missing dependencies for the following libraries:
libdirect-1.4.so.0
libdirectfb-1.4.so.0
libfusion-1.4.so.0

然后我修改package/utils/directfb-examples/Makefile文件,依据经验加入DEPENDS

define Package/directfb-examples
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE:=directfb examples
  DEPENDS:=+libdirectfb
endef

再编译,还是提示

Package directfb-examples is missing dependencies for the following libraries:
libdirect-1.4.so.0
libdirectfb-1.4.so.0
libfusion-1.4.so.0

那么问题来了,我加入了DEPENDS,为什么还会报错?

首先确定报错消息是从哪里来的,经过一番查找,在文件package-ipkg.mk中有一个CheckDependencies

  define CheckDependencies
        @( \
                rm -f $(PKG_INFO_DIR)/$(1).missing; \
                ( \
                        export \
                                READELF=$(TARGET_CROSS)readelf \
                                OBJCOPY=$(TARGET_CROSS)objcopy \
                                XARGS="$(XARGS)"; \
                        $(SCRIPT_DIR)/gen-dependencies.sh "$$(IDIR_$(1))"; \
                ) | while read FILE; do \
                        grep -qxF "$$$$FILE" $(PKG_INFO_DIR)/$(1).provides || \
                                echo "$$$$FILE" >> $(PKG_INFO_DIR)/$(1).missing; \
                done; \
                if [ -f "$(PKG_INFO_DIR)/$(1).missing" ]; then \
                        echo "Package $(1) is missing dependencies for the following libraries:" >&2; \
                        cat "$(PKG_INFO_DIR)/$(1).missing" >&2; \
                        false; \
                fi; \
        )
  endef

看package-ipkg.mk文件,其主要的工作应该就是在编译完后检查所有二进制文件依赖的库。

CheckDependencies的动作则是检查你需要的库在$(PKG_INFO_DIR)/$(1).provides中是否存在,如果不在("||"这个操作)就放到$(PKG_INFO_DIR)/$(1).missing里面,如果有*.missing,那么就报错。

此外,从上面代码可看$(1)就是package的name,其他变量都可以加入打印,一一得出。我这边对应如下

$(PKG_INFO_DIR)    ——  xxx/staging_dir/target/pkginfo
$(1)  ——  directfb-examples
OK,那我们进入staging/xxx/pkginfo里面看一下发现里面有很多*.providers文件,里面内容是一些库的名字。

我们在这些文件中找一下我们缺失的库grep -r libdirectfb-1.4.so.0,结果如下

$ grep -r libdirectfb-1.4.so.0
directfb.provides:libdirectfb-1.4.so.0
directfb.provides:libdirectfb-1.4.so.0.2.0

找到了,发现在directfb.provides中包含这个库,但是providers前面为啥是directfb呢,这么非主流?库的话大家都是libxxx.providers的啊,看看directfb的Makefile就知道了

$(eval $(call BuildPackage,directfb))
由于这里使用的时directfb,所以最终生成的是directfb.provides文件。


这里补充一点,.providers文件表达了什么意思? 提供么

应该是的。我们打开directfb.provides,发现里面还有有libc、libpthread等各种库。

如果我现在有一个package,只依赖libpthread,我是否可以这样写DEPENDS:=+directfb?

个人没有实验,但是应该可以编译通过。但是你编译该package之前必须编译directfb,不太合理。


OK,原因分析完毕,所以本例有两种解决办法:

第一种:修改directfb-examples/Makefile

define Package/directfb-examples
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE:=directfb examples
  DEPENDS:=+directfb
endef

第二种,修改libdirectfb/Makefile,如下所示,当然Makefile中对于的directfb也要换成libdirectfb

$(eval $(call BuildPackage,libdirectfb))

个人是按照第二种方法来的,库前面加个lib,约定俗成。








  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值