如何解决OpenWrt包依赖关系

一)仅运行时依赖
    如果你的包依赖不需要在编译包期间做什么,比如只是个Luci界面扩展,或者只是一些脚本,那么加到Makefile里面就可以了。

define Package/mypackage
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=My first package
    DEPENDS:=+another_package
endef


二)编译时依赖
    但也有很多时候,包会提供动态链接库,依赖它的包会使用这个动态链接库,这时就需要改更多地方来实现编译时的依赖。
比如我让mypackage依赖libuci这个包,并在程序中使用libuci.so。首先,修改Makefile:

define Package/mypackage
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=My first package
    DEPENDS:=+libuci
endef
# LDLIBS参数会被传入src/Makefile中来使用
MAKE_FLAGS += LDLIBS+="-luci"


然后更新src/main.c,这里没有做实际的事情,只是调用了libuci.so中的两个方法。

#include <stdio.h>
#include <uci.h>
int main(int argc, char** argv)
{
    struct uci_context* context = uci_alloc_context();
    puts("Hello, OpenWrt!");
    uci_free_context(context);
    return 0;
}

在openwrt目录下更新依赖并编译,下载依赖只需要在第一次加依赖的时候做:

./scripts/feeds update base
./scripts/feeds install libuci
make package/mypackage/compile

最终编译成功,并在路由器上也可以成功安装运行,让自己的包可以被编译时依赖。

查看libuci的Makefile文件,可以看到以下内容:

define Build/InstallDev
    $(INSTALL_DIR) $(1)/usr/include
    $(CP) $(PKG_BUILD_DIR)/uci{,_config,_blob,map}.h $(1)/usr/include
    $(INSTALL_DIR) $(1)/usr/lib
    $(CP) $(PKG_BUILD_DIR)/libuci.so* $(1)/usr/lib
    $(CP) $(PKG_BUILD_DIR)/libucimap.a $(1)/usr/lib
endef

    Build/InstallDev这段定义了在编译完成时做的事情,这里提供了头文件uci.h和动态链接库libuci.so给后来编译的包,也是就依赖它的包,来使用。
在IDE里编辑

    如果在IDE里面编辑main.c,会出现找不到uci.h的问题。在使用命令成功编译后,这个头文件的位置在openwrt目录下的staging_dir/<target>/usr/include。将这个目录加到IDE的C/C++头文件引用路径就可以解决这个问题。

本文章由作者:佐须之男 整理编辑,原文地址: 如何解决OpenWrt包依赖关系
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐