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,约定俗成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)