一、引言
近期项目中需要用到ubus相关内容,ubus是OpenWrt中的进程间通信机制。Ubus源码可以很容易地从网上下载到,但是要想应用到实际项目中,需要进行移植。网上关于ubus移植的文章琳琅满目,但是仔细阅读下来发现,这些文章要么讲得很粗略,要么充斥着一些无效和重复的内容。对于刚接触ubus的开发者来说,这些文章并不能正确指导开发者如何移植和使用ubus。因此博主写下此文,记录移植的详细过程,同时也为其他开发者提供一些参考。
二、ubus的依赖关系
Ubus是新的openWrt中引入的一个消息总线,主要作用是实现不同应用程序之间的信息交互。Ubus的编译和运行依赖libubox中的一些内容,而libubox又依赖于json-c中的内容,环环相扣。因此,我们需要按照先json-c,后libubox,最后ubus的顺序来编译。
三、环境说明
博主本人使用的系统环境如下:
宿主机系统:Ubuntu 16.04
目标机CPU:ARM Cortex-A7 32bit 800MHz
交叉编译器:arm-buildroot-linux-uclibcgnueabihf-gcc
四、获取源码
git clone https://github.com/json-c/json-c.git
git clone http://git.openwrt.org/project/libubox.git
git clone https://git.openwrt.org/project/ubus.git
将这3份源码下载后,放到同一个目录下,并在该目录下新建3个文件名分别为"toolChain_json.cmake"、"toolChain_libubox.cmake"、"toolChain_ubus.cmake"的空白文件,如下图所示:
五、编译json-c
修改文件toolChain_json.cmake的内容为如下内容:
set(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/ssc_toolchains/arm-buildroot-linux-uclibcgnueabihf-4.9.4-uclibc-1.0.31")
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH "/home/allen/open_lib/libubox/src/json-c")
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
其中,
TOOLCHAIN_DIR 为交叉编译工具链所在的目录
CMAKE_C_COMPILER 是交叉编译器gcc的名称
CMAKE_CXX_COMPILER 是交叉编译器g++的名称
CMAKE_FIND_ROOT_PATH 是json-c源码存放的路径
以上这些需要根据实际情况填写。
修改好后,cd进入json-c目录,执行如下命令:
cmake -DCMAKE_INSTALL_PREFIX=/home/allen/open_lib/libubox/install -DCMAKE_TOOLCHAIN_FILE=../toolChain_json.cmake .
make
make install
其中-DCMAKE_INSTALL_PREFIX是用来指定编译后库文件的安装路径。当这3条命令执行成功后,就会在"/home/allen/open_lib/libubox/install"目录下生成"include"和"lib"两个目录,这就是json-c的库文件。后面两个模块的编译需要用到这里面的内容,后续编译产生的库文件,也是放到这个路径下。
六、编译libubox
修改文件toolChain_libubox.cmake的内容为如下内容:
set(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/ssc_toolchains/arm-buildroot-linux-uclibcgnueabihf-4.9.4-uclibc-1.0.31")
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf-g++)
set(INSTALL_PATH "/home/allen/open_lib/libubox/install")
include_directories(${INSTALL_PATH}/include)
include_directories(${INSTALL_PATH}/include/json-c)
set(CMAKE_FIND_ROOT_PATH "/home/allen/open_lib/libubox/src/libubox")
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(json "/home/allen/open_lib/libubox/install/lib/libjson-c.so")
其中,
INSTALL_PATH 是上一步骤中编译产生的库文件的安装路径
CMAKE_FIND_ROOT_PATH 是libubox源码的存放路径
json用来指定libjson-c动态库的路径
以上这些根据实际情况填写。
修改好后,cd进入libubox目录,执行如下命令:
cmake -DBUILD_LUA=OFF -DCMAKE_INSTALL_PREFIX=/home/allen/open_lib/libubox/install -DCMAKE_TOOLCHAIN_FILE=../toolChain_libubox.cmake .
make
make install
七、编译ubus
修改文件toolChain_ubus.cmake的内容为如下内容:
set(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/ssc_toolchains/arm-buildroot-linux-uclibcgnueabihf-4.9.4-uclibc-1.0.31")
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf-g++)
set(INSTALL_PATH "/home/allen/open_lib/libubox/install")
include_directories(${INSTALL_PATH}/include)
set(CMAKE_FIND_ROOT_PATH "/home/allen/open_lib/libubox/src/ubus" $(INSTALL_PATH))
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(blob_library ${INSTALL_PATH}/lib/libblobmsg_json.so)
set(json ${INSTALL_PATH}/lib/libjson-c.so)
set(ubox_include_dir ${INSTALL_PATH}/include/libubox)
set(ubox_library ${INSTALL_PATH}/lib/libubox.so)
和前面一样,涉及到具体路径的地方按照实际情况修改。
修改好后,cd进入ubus目录,执行如下命令:
cmake -DBUILD_LUA=OFF -DCMAKE_INSTALL_PREFIX=/home/allen/open_lib/libubox/install -DCMAKE_TOOLCHAIN_FILE=../toolChain_ubus.cmake .
make
make install
至此,ubus的移植就完成了。接下来可以将install目录下的内容拷贝到项目的工程中,包含和引用相应的库之后,就可以使用ubus提供的功能了。
————————————————
版权声明:本文为CSDN博主「f大熊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fun_tion/article/details/107785425