移植编译libubox、ubus、json-c的详细过程

一、引言

        近期项目中需要用到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提供的功能了。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页