easycwmp的交叉编译

原创作品,转载请注明出处

copyright:weishusheng   2015.3.18

email:[email protected]

tel:13657214139

平台:

Linux version 2.6.32-279.el6.x86_64

交叉编译器路径:/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-

开发板:FL2440

开发板运行内核:linux3.0

开发板文件系统:jffs2

一、准备工作

1.创建fl-easycwmp目录用以存放安装文件

[[email protected] ~]$ mkdir fl-easycwmp

2.创建install目录

[[email protected] ~]$ cd fl-easycwmp/
[[email protected] fl-easycwmp]$ ls
[[email protected] fl-easycwmp]$ mkdir install
[[email protected] fl-easycwmp]$ ls
install

二、交叉编译json-c

1.获取json-c源文件

[[email protected] fl-easycwmp]$ git clone git://github.com/json-c/json-c.git ./json-c

2.创建build.sh

[[email protected] json-c]$ vim build.sh

#!/bin/bash
PRJ_PATH=`pwd`
#CROSS=/opt/buildroot-2011.11/arm920t/usr/bin/arm-linux-
CROSS=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-
make clean
#autoreconf -i
export CC=${CROSS}gcc
export CPP=${CROSS}cpp
export AS=${CROSS}as
export LD=${CROSS}ld
export AR=${CROSS}ar
export RANLIB=${CROSS}ranlib
export STRIP=${CROSS}strip
export ac_cv_func_malloc_0_nonnull=yes
export ac_cv_func_realloc_0_nonnull=yes
export ac_cv_have_decl_isinf=yes
export ac_cv_have_decl_isnan=yes
#export LDFLAGS += -lm
./configure --enable-rdrand --disable-dependency-tracking --with-PACKAGE --with-gnu-ld --with-pic --bu
ild=i686-pc-linux-gnu --host=arm-linux --prefix=${PRJ_PATH}/../install

顺便说一下makefile里cflags的-Wall -o2 -g

-Wall 是打开警告开关,-O代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化。
-g是生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息

3.安装json-c

[[email protected] json-c]$ sh build.sh

然后在生成的Makefile里把修改LDFLAGS = -lm,注意每次修改后要make clean(make clean仅仅是清除之前编译的可执行文件及配置文件。 而make distclean要清除所有生成的文件。)

make

make install

三、安装libubox

1、获取libubox

[[email protected] fl-easycwmp]$ git clone git://nbd.name/luci2/libubox.git ./libubox

2.在工程主CMakeLists.txt 中首先加入如下语句:(##注意Linux第一个字母为大写,否则cmake不认识)

[[email protected] libubox]$ vim CMakeLists.txt

SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/buildroot-2012.08/arm920t/usr")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY "/home/weishusheng/fl-easycwmp/install/lib/")
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-g++)
SET(CMAKE_INSTALL_PREFIX "/home/weishusheng/fl-easycwmp/install/")

3.生成Makefile

[[email protected] libubox]$ cmake CMakeLists.txt -DBUILD_LUA=OFF

4.make

错误解决:

错误1

/home/weishusheng/fl-easycwmp/libubox/blobmsg_json.c: In function ‘__blobmsg_add_json‘:
/home/weishusheng/fl-easycwmp/libubox/blobmsg_json.c:78:2: error: implicit declaration of function ‘is_error‘

分析:is_error没有定义,在pc上编译时也遇到这个问题,我们知道他的定义为#define is_error(ptr) (ptr == NULL),于是添加定义

[[email protected] libubox]$ vim /home/weishusheng/fl-easycwmp/libubox/blobmsg_json.c

#include "blobmsg.h"
#include "blobmsg_json.h"
#define is_error(ptr) (ptr == NULL)

错误2

cannot find -ljson-c

在CMakeLists.txt里指定json-c库路径

[[email protected] libubox]$ vim CMakeLists.txt

LINK_DIRECTORIES(/home/weishusheng/fl-easycwmp/install/lib/)

错误3

/home/weishusheng/fl-easycwmp/libubox/jshn.c: In function ‘jshn_parse‘:
/home/weishusheng/fl-easycwmp/libubox/jshn.c:162:2: error: implicit declaration of function ‘is_error‘

添加定义

#define is_error(ptr) (ptr == NULL)

4.

/home/weishusheng/cross_easycwmp/install/lib/libjson-c.so: undefined reference to `__isnan‘
/home/weishusheng/cross_easycwmp/install/lib/libjson-c.so: undefined reference to `__isinf‘

这个问题让我抓狂,但你们按我的博客做下来不会出现这个问题,因为我在前面写json-c的安装时为你们解决了,如果有遇到类似问题的,可以尝试在编译json-c时加上

export ac_cv_have_decl_isinf=yes
export ac_cv_have_decl_isnan=yes

并连接上数学库即LDFLAGS+=-lm

四、安装uci

1.获取uci

[[email protected] fl-easycwmp]$ git clone git://nbd.name/uci.git ./uci

2.修改CMakeList.txt

[[email protected] uci]$ vim CMakeLists.txt
SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/buildroot-2012.08/arm920t/usr")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-g++)
SET(CMAKE_INSTALL_PREFIX "/home/weishusheng/fl-easycwmp/install/")

cmake_minimum_required(VERSION 2.6)

3.生成makefile

[[email protected] uci]$ cmake CMakeLists.txt -DBUILD_LUA=OFF

4.make

/opt/buildroot-2012.08/arm920t/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.5.4/../../../../arm-unknown-linux-uclibcgnueabi/bin/ld: cannot find -lubox

在CMakeList.txt里加入LINK_DIRECTORIES(/home/weishusheng/fl-easycwmp/install/lib/),问题解决

5.make install

五、安装ubus

1.获取ubus

git clone git://nbd.name/luci2/ubus.git ./ubus

2.修改CMakeList.txt

[[email protected] ubus]$ vim CMakeLists.txt 
SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/buildroot-2012.08/arm920t/usr")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-g++)
SET(CMAKE_INSTALL_PREFIX "/home/weishusheng/fl-easycwmp/install/")

3.生成makefile

[[email protected] ubus]$ cmake CMakeLists.txt -DBUILD_LUA=OFF

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
json
linked by target "cli" in directory /home/weishusheng/fl-easycwmp/ubus

解决办法:在CMakeList.txt里指定json库路径,通过修改SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)为

SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY "/home/weishusheng/fl-easycwmp/install/lib")可解决。

4.make

错误:cannot find -lubox

解决办法:在CMakeLists里加上LINK_DIRECTORIES(/home/weishusheng/fl-easycwmp/install/lib)

错误:json/json.h: No such file or directory

 解决办法:交叉编译时默认标准头文件是交叉编译器路径下的,可以用echo ‘main(){}‘|/opt/buildroot-

2012.08/arm920t/usr/bin/arm-linux-gcc -E -v - 命令进行查看,我们把需要用到的头文件加到上诉命令找到的位置就可以

了,另外,交叉编译会到系统默认标准库目录下找库文件,这会导致格式不符合,我们需要用-L及-l指定库文件

[[email protected] json-c]$ pwd
/home/weishusheng/fl-easycwmp/install/include/json-c
[[email protected] json-c]$ sudo mkdir /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-

uclibcgnueabi/sysroot/usr/include/json
[[email protected] json-c]$ sudo cp * /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-

uclibcgnueabi/sysroot/usr/include/json
[[email protected] json-c]$

六、安装microxml

1.获取源文件

[[email protected] fl-easycwmp]$ git clone git://dev.freecwmp.org/microxml ./microxml

2、建立build.sh文件

[[email protected] microxml]$ vim build.sh
#!/bin/bash
PRJ_PATH=`pwd`
#CROSS=/opt/buildroot-2011.11/arm920t/usr/bin/arm-linux-
CROSS=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-
make distclean
autoreconf -i
export CC=${CROSS}gcc
export CPP=${CROSS}cpp
export AS=${CROSS}as
export LD=${CROSS}ld
export AR=${CROSS}ar
export RANLIB=${CROSS}ranlib
export STRIP=${CROSS}strip
./configure --host=arm-linux --prefix=${PRJ_PATH}/../install
make && make install

3.执行

[[email protected] microxml]$ sh build.sh

//七、把shflags.sh放到/usr/share/shflags/目录里

七、最后终于要编译easycwmp了

1.获取源文件

[[email protected] fl-easycwmp]$ wget http://easycwmp.org/download/easycwmp-1.0.5.tar.gz

2.解压,把easycwmp-1.0.5更名为easycwmp并进入该目录

[[email protected] fl-easycwmp]$ cp ../cross_easycwmp/easycwmp-1.0.5.tar.gz .

[[email protected] fl-easycwmp]$ mv easycwmp-1.0.5 easycwmp
[[email protected] fl-easycwmp]$ cd easycwmp

3.生成makefile

[[email protected] easycwmp]$ autoreconf -i

3.生成makefile

[[email protected] easycwmp]$ CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc AR=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar LD=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ld AS=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-as RANLIB=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib CPP=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-cpp ./configure --host=arm-linux --prefix=/home/weishusheng/fl-easycwmp/install MICROXML_CFLAGS="-I/home/weishusheng/fl-easycwmp/install/include -D_THREAD_SAFE -D_REENTRANT" MICROXML_LIBS="-L/home/weishusheng/fl-easycwmp/install/lib -lmicroxml -lpthread" --enable-debug --enable-devel --enable-acs=multi --enable-jsonc=1 --with-uci-include-path=/home/weishusheng/fl-easycwmp/uci/

4.[[email protected] easycwmp]$ make

错误:curl/curl.h: No such file or directory

解决办法:a、先交叉编译curl(下载地址http://curl.haxx.se/download.html),

       b、[[email protected] include]$ sudo mkdir /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux- 

uclibcgnueabi/sysroot/usr/include/curl

               c、[[email protected] fl-easycwmp]$ tar -xzf curl-7.41.0.tar.gz 

               d、vim build.sh

#!/bin/bash
                         PRJ_PATH=`pwd`
                         #CROSS=/opt/buildroot-2011.11/arm920t/usr/bin/arm-linux-
                         CROSS=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-
                         make distclean
                         autoreconf -i
                         export CC=${CROSS}gcc
                         export CPP=${CROSS}cpp
                         export AS=${CROSS}as
                         export LD=${CROSS}ld
                         export AR=${CROSS}ar
                         export RANLIB=${CROSS}ranlib
                         export STRIP=${CROSS}strip
                        ./configure --host=arm-linux --prefix=${PRJ_PATH}/../install
                        make && make install

e.把头文件复制到相应位置          

[[email protected] curl]$ pwd
               /home/weishusheng/fl-easycwmp/install/include/curl
               [[email protected] curl]$ ls
               curlbuild.h curlrules.h easy.h multi.h typecheck-gcc.h
               curl.h curlver.h mprintf.h stdcheaders.h

[[email protected] curl]$ sudo cp * /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclibcgnueabi/sysroot/usr/include/curl

错误:src/ubus.c:14:21: fatal error: libubus.h: No such file or directory
解决办法:

[[email protected] ubus]$ pwd
/home/weishusheng/fl-easycwmp/ubus
[[email protected] ubus]$ sudo cp libubus.h /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-

uclibcgnueabi/sysroot/usr/include/

错误:ubusmsg.h: No such file or directory
解决办法:

[[email protected] ubus]$ pwd
/home/weishusheng/cross_easycwmp/ubus

[[email protected] ubus]$ sudo cp ubusmsg.h /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-
uclibcgnueabi/sysroot/usr/include/

错误:ubus_common.h: No such file or directory

解决办法:

[[email protected] ubus]$ sudo cp ubus_common.h /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-
uclibcgnueabi/sysroot/usr/include/

错误:src/json.c:42: undefined reference to `is_error‘

解决办法:

vim src/json.c

#define is_error(ptr) (ptr == NULL)

[[email protected] easycwmp]$ make

[[email protected] easycwmp]$ make install

至此easycwmp的交叉编译完成,接下来放到FL2440开发板上跑,在开发板上还要做相关设置,请参考下一遍博文。

时间: 2024-12-26 01:52:17

easycwmp的交叉编译的相关文章

tr069开源协议EasyCwmp移植

1.平台MT7628 2.交叉编译器及版本信息mipsel-linux + buildroot-gcc463_32bits.tar.bz2 3.创建工作目录[email protected]:~$ mkdir -p tr069/usr [email protected]:~/tr069/usr$ pwd/home/lancer/tr069/usr 4.移植json-c ----------------------------------------------------------------

easycwmp在FL2440开发板上的配置

原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:[email protected] tel:13657214139 平台: Linux version 2.6.32-279.el6.x86_64 交叉编译器路径:/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux- 开发板:FL2440 开发板运行内核:linux3.0 开发板文件系统:initramfs initramfs运行在RAM,掉电后

linux 安装交叉编译工具

以arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2为例 1.获取要安装的交叉编译工具.(一般芯片厂商提供,也可自行下载) 2.使用tar命令:tar jxvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 解压缩安装到当前目录下(tar 后面参数可根据具体压缩格式进行变换) 3.使用find .pwd获取安装路径 进入到上一步解压目录使用find查找bin目录 find . -name bin.如果bin目录下有下面交叉编译工具,表

使用ndk交叉编译android各平台版本的第三方库

只要弄明白了ndk-bundle的目录结构,交叉编译的基本原理就可以自行编写脚本去编译了.从仓库拿下代码包后,一般在linux平台下编译当前平台使用的库,只要使用其自动配置脚本configure进行平台相关的配置,配置成功后就可以执行make进行编译以及安装.configure通常会在/usr/inclue和/usr/lib下检查平台支持的接口,编译时需要使用binutils和gcc两个工具集合.所以要使用ndk进行交叉编译,最基本就是要对上面4要素进行配置,就可以配置出最基本的交叉平台环境,顺

交叉编译

在一种计算机环境中运行的编译器,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译.这个编译过程就叫交叉编译. 简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler). 这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)和 操作系统(Operating System). 同一个体系结构可以运行不同的操作系统:同样,同一个操作系统也可以在不同的体系结构上运行. 常见的交叉编译例子如下: 1.在

Ubuntu 16.04 安装 arm-linux-gcc 嵌入式交叉编译环境 问题汇总

闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充分,图片都没有保存) 首先就是上网查找一下现成的教程,下面的网址就是一个很好的教程 http://www.cnblogs.com/softhal/p/5699381.html 第一.二.三步我都是照做的 但是在第四步的时候对于我这种新手来说就出现了一些问题: 1.第一种方法,修改bashrc文件,总

window7下 cocos2dx android交叉编译环境部署小结

上周被android交叉编译搞惨了,还好最后弄好了,写个小结以后备用吧. 步骤,1.下载cygwin的devel和shells模块 2. 2.设置环境变量 a.设置NDK_ROOT b.设置Path 编辑Path,在后面追加4个环境变量,以;号隔开(别忘了给前面的加上;),4个分别是android的sdk的platform-tools,android的sdk的tools,   cygwin的bin,上面添加的NDK_ROOT C:\Work\adt-bundle-windows-x86_64-2

Linux下获取arm的交叉编译工具链

转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gneabihf-gcc等. 前言 这里有一个专门的说法: “arm-linux-gnueabihf-gcc是由 Linaro 公司基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括裸机程序.u-boot.Linux kernel.filesystem和App应用程序.使

更换Qt QtEmbedded库的版本出现问题及解决(交叉编译OpenSSL)

近日将QtEmbedded库的版本由4.7.0更新到4.7.4.工具链并未改变,仍为 Target: arm-none-linux-gnueabiConfigured with: ......Thread model: posixgcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) 所有依赖的库根据需要重新下载最新版本编译.现将在此过程中出现的问题及解决方法列出,以供下次移植时参考. 1.browser程序重新编译,在开发板的命令行运行:./browse