ubus移植到openwrt

最近在研究openwrt下的ubus的使用,在使用之前,需要进行相关软件包的移植,在移植过程中遇到了一些问题,在此记录下,有需要的朋友可以参考下。

本文主要移植的软件包有libjson-c,libubox,libuv,ubus,下面依次来进行移植。

系统环境:Ubuntu 14.04 LTS

软件包源码:json-c-0.12.1-nodoc.tar.gz

交叉编译环境:misel-openwrt-linux-

软件包的源码我是从openwrt包中直接解压出来的,也可以去官网下载。

首先移植json-c-0.12.1-nodoc.tar.gz

进入json-c-0.12.1源码路径,手动修改config.h.in,注释掉或者删除下面两行 
//#undef malloc
//#undef realloc

我是直接删除的,当然注释掉也可以,接下来就是对Configure的配置,我的配置如下:


运行完,就可以进行make了


可以看到,编译成功,接下来进行安装,即运行make install


到我们设置好的路径下,可以查看已经生成了相应的库和头文件


现在移植libubox,用到的软件源码包是libubox-2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb.tar.gz

老规矩,先解压源码,然后进入到源码路径下,libubox生成Makefile是采用cmake的方式,cmake自己去问度娘吧,这里就不多介绍了。

首先,把如下代码添加到CmakeList.txt的最开头

SET(CMAKE_SYSTEM_NAME Linux)

#指定C交叉编译器,必须配置

#或交叉编译器使用绝对地址
SET(CMAKE_C_COMPILER"/project/openwrt-lidora/openwrt_lidora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc")

#指定C++交叉编译器

SET(CMAKE_CXX_COMPILER"/project/openwrt-lidora/openwrt_lidora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-g++")

include_directories("/home/zhangfuyu/libs/json/include/json-c")

include_directories("/home/zhangfuyu/libs/json/include")

link_directories("/home/zhangfuyu/libs/json/lib")

如果是首次运行,编译器环境变量设置正确的话,就可以运行cmake .


这样Makefile生成了,然后进行make,出现错误......

/home/zhangfuyu/libs/json/lib/libjson-c.so: undefined reference to `__isnan'
/home/zhangfuyu/libs/json/lib/libjson-c.so: undefined reference to `__isinf'
collect2: error: ld returned 1 exit status
make[2]: *** [jshn] 错误 1
make[1]: *** [CMakeFiles/jshn.dir/all] 错误 2
make: *** [all] 错误 2

根据提示是移植json-c的问题,所以要重新编译json-c,进入json-c源码路径,添加下面两行

export ac_cv_have_decl_isinf=yes

export ac_cv_have_decl_isnan=yes

并在Makefile中给变量LDFLAGS连接上数学库即LDFLAGS+=-lm

重编编译json-c即可。

重新编译完json-c我们回到libubox-2015-11-08源码目录下,重新编译libubox,

编译成功

修改cmake_install.cmake 文件,设置安装路径

接着make install,到我们设置好的路径下,可以查看已经生成了相应的库和头文件


Note:在移植libubox的过程中,我尝试过两个不同版本的编译器去编译,这会导致一个问题,就是明明修改了CmakeList.txt中的编译器的路径和名称、相关的JSON-C库的路径,但是在编译时使用的还是另一个交叉编译器和并且去/usr/local/lib下找json-c库,经过查看,发现libubox下面有这么一个文件CMakeCache.txt,查看这个文件,发现这个文件里面的编译器和json-c库的路径设置都是之前的,所以尝试修改为新的编译器的路径和json-c的安装路径,和编译器相关的有很多,只需要修改这个变量的路径,其余的会自己修改回来,具体的为什么没有仔细研究,有兴趣的可以研究下。


json-c 库的路径设置


接下来,移植ubus,软件源码包ubus-2015-05-25-f361bfa5fcb2daadf3b160583ce665024f8d108e.tar.gz

先解压源码,然后进入到源码路径下


首先,把如下代码添加到CmakeList.txt的最开头

SET(CMAKE_SYSTEM_NAME Linux)
#指定C交叉编译器,必须配置
#或交叉编译器使用绝对地址
SET(CMAKE_C_COMPILER"/project/openwrt-lidora/openwrt_lidora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc")
#指定C++交叉编译器
SET(CMAKE_CXX_COMPILER "/project/openwrt-lidora/openwrt_lidora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-g++")
INCLUDE_DIRECTORIES(/home/zhangfuyu/libs/json/include/json-c)
INCLUDE_DIRECTORIES(/home/zhangfuyu/libs/json/include)
LINK_DIRECTORIES(/home/zhangfuyu/libs/json/lib)

INCLUDE_DIRECTORIES(/home/zhangfuyu/libs/ubox/include/libubox)

INCLUDE_DIRECTORIES(/home/zhangfuyu/libs/ubox/include)

LINK_DIRECTORIES(/home/zhangfuyu/libs/ubox/lib)

接着进行cmake .


进行编译,make,编译内容如下,

[  6%] Building C object CMakeFiles/ubus.dir/libubus.c.o

[ 12%] Building C object CMakeFiles/ubus.dir/libubus-io.c.o
[ 18%] Building C object CMakeFiles/ubus.dir/libubus-obj.c.o
[ 25%] Building C object CMakeFiles/ubus.dir/libubus-sub.c.o
[ 31%] Building C object CMakeFiles/ubus.dir/libubus-req.c.o
Linking C shared library libubus.so
[ 31%] Built target ubus
[ 37%] Building C object CMakeFiles/cli.dir/cli.c.o
Linking C executable ubus
[ 37%] Built target cli
[ 43%] Building C object CMakeFiles/ubusd.dir/ubusd.c.o
[ 50%] Building C object CMakeFiles/ubusd.dir/ubusd_id.c.o
[ 56%] Building C object CMakeFiles/ubusd.dir/ubusd_obj.c.o
[ 62%] Building C object CMakeFiles/ubusd.dir/ubusd_proto.c.o
[ 68%] Building C object CMakeFiles/ubusd.dir/ubusd_event.c.o
Linking C executable ubusd
[ 68%] Built target ubusd
[ 75%] Building C object lua/CMakeFiles/ubus_lua.dir/ubus.c.o
Linking C shared module ubus.so
[ 75%] Built target ubus_lua
[ 81%] Building C object examples/CMakeFiles/client.dir/client.c.o
[ 87%] Building C object examples/CMakeFiles/client.dir/count.c.o
Linking C executable client
[ 87%] Built target client
[ 93%] Building C object examples/CMakeFiles/server.dir/server.c.o
[100%] Building C object examples/CMakeFiles/server.dir/count.c.o
Linking C executable server
[100%] Built target server

编译成功,设置下安装路径,修改下cmake_install.cmake中的安装路径,修改内容和libubox类似,就不做说明了,设置完make install

[ 31%] Built target ubus
[ 37%] Built target cli
[ 68%] Built target ubusd
[ 75%] Built target ubus_lua
[ 87%] Built target client
[100%] Built target server
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libubus.so
-- Removed runtime path from "/usr/local/lib/libubus.so"
-- Installing: /usr/local/bin/ubus
-- Removed runtime path from "/usr/local/bin/ubus"
-- Installing: /usr/local/sbin/ubusd
-- Removed runtime path from "/usr/local/sbin/ubusd"
-- Installing: /usr/local/include/ubusmsg.h
-- Installing: /usr/local/include/ubus_common.h
-- Installing: /usr/local/include/libubus.h
-- Installing: /usr/local/lib/lua/5.2/ubus.so

-- Removed runtime path from "/usr/local/lib/lua/5.2/ubus.so"

安装成功,进入到相应的目录下,查看相关头文件和库


最后移植libuv,用到的软件源码包libuv-v1.9.0.tar.gz

先解压源码,并进入到源码路径下,libuv的移植和json-c移植步骤类似,步骤如下




配置成功,然后进行make 

 CC       src/libuv_la-fs-poll.lo
  CC       src/libuv_la-inet.lo
  CC       src/libuv_la-threadpool.lo
  CC       src/libuv_la-uv-common.lo
  CC       src/libuv_la-version.lo
  CC       src/unix/libuv_la-async.lo
  CC       src/unix/libuv_la-core.lo
  CC       src/unix/libuv_la-dl.lo
  CC       src/unix/libuv_la-fs.lo
src/unix/fs.c: In function 'uv__fs_utime':
src/unix/fs.c:645:3: warning: passing argument 2 of 'utimes' from incompatible pointer type [enabled by default]
   return utimes(req->path, &buf); /* TODO use utimes() where available */
   ^
In file included from src/unix/linux-syscalls.h:31:0,
                 from src/unix/internal.h:38,
                 from src/unix/fs.c:30:
/project/openwrt-lidora/openwrt_lidora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/include/sys/time.h:140:12: note: expected 'const struct timeval *' but argument is of type 'struct utimbuf *'
 extern int utimes (__const char *__file, __const struct timeval __tvp[2])
            ^
  CC       src/unix/libuv_la-getaddrinfo.lo
  CC       src/unix/libuv_la-getnameinfo.lo
  CC       src/unix/libuv_la-loop-watcher.lo
  CC       src/unix/libuv_la-loop.lo
  CC       src/unix/libuv_la-pipe.lo
  CC       src/unix/libuv_la-poll.lo
  CC       src/unix/libuv_la-process.lo
  CC       src/unix/libuv_la-signal.lo
  CC       src/unix/libuv_la-stream.lo
  CC       src/unix/libuv_la-tcp.lo
  CC       src/unix/libuv_la-thread.lo
  CC       src/unix/libuv_la-timer.lo
  CC       src/unix/libuv_la-tty.lo
  CC       src/unix/libuv_la-udp.lo
  CC       src/unix/libuv_la-linux-core.lo
  CC       src/unix/libuv_la-linux-inotify.lo
  CC       src/unix/libuv_la-linux-syscalls.lo
  CC       src/unix/libuv_la-proctitle.lo

  CCLD     libuv.la

编译成功,然后进行make install


安装成功,进入相应的目下查看,


至此,ubus相关的库包移植完成。

接下来,对移植的库包进行验证,有时间再写了。

参考文章:

easycwmp的交叉编译:http://www.mamicode.com/info-detail-526161.html

ubus移植到openwrt:https://blog.csdn.net/geng823/article/details/47603421


猜你喜欢

转载自blog.csdn.net/u012154319/article/details/80551069
今日推荐