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

copyright:weishusheng   2015.3.18

email:642613208@qq.com

平台:

Linux version 2.6.32-279.el6.x86_64

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

开发板:FL2440

开发板运行内核:linux3.0

开发板文件系统:initramfs

easycwmp依赖的许多软件的Makefile都是用cmake语法生成的,故简单介绍一下要经常用到的几个cmake语法:

1.LINK_DIRECTORIES:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

2.INCLUDE_DIRECTORIES:指定头文件搜索路径,相当于-I参数

3.TARGET_LINK_LIBRARIES(uci ubox)添加链接库,相同于指定-l参数。
如:target_link_libraries(demo Hello)  #将可执行文件与Hello连接成最终文件demo

4.find_library(THREAD_DB_LIBRARY NAMES thread_db PATHS /usr/lib/ /usr/local/lib/)

在目录"/usr/lib"和"/usr/local/lib"下查找libthread_db.so,如果找到则把库文件的绝对路径赋给THREAD_DB_LIBRARY

一、准备工作

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

[weishusheng@localhost ~]$ mkdir fl-easycwmp

2.创建install目录

[weishusheng@localhost ~]$ cd fl-easycwmp/
[weishusheng@localhost fl-easycwmp]$ ls
[weishusheng@localhost fl-easycwmp]$ mkdir install
[weishusheng@localhost fl-easycwmp]$ ls
install

二、交叉编译json-c

1.获取json-c源文件

[weishusheng@localhost fl-easycwmp]$ git clone git://github.com/json-c/json-c.git ./json-c

2.创建build.sh

[weishusheng@localhost 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是生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息;-pg是生成函数调用关系,函数执行时间等信息,将这些信息保存在gmon.out中,可用gprof命令进行查看

3.安装json-c

[weishusheng@localhost json-c]$ sh build.sh

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

make

make install

三、安装libubox

1、获取libubox

[weishusheng@localhost fl-easycwmp]$ git clone git://nbd.name/luci2/libubox.git ./libubox

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

[weishusheng@localhost libubox]$ vim CMakeLists.txt

SET(CMAKE_SYSTEM_NAME Linux)            #告诉编译器你要交叉编译,Linux是你要编译过去的平台
SET(TOOLCHAIN_DIR "/opt/buildroot-2012.08/arm920t/usr")        #告诉编译器交叉编译器路径
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})                   #告诉cmake查找的根目录是什么
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)               #告诉cmake怎么查找编译时的工具程序的位置
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY "/home/weishusheng/fl-easycwmp/install/lib/")     #告诉cmake怎么查找编译时的库文件的位置
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)                 #告诉cmake怎么查找编译时的头文件的位置
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/")

注意:

ONLY表示只在CMAKE_FIND_ROOT_PATH下找

BOTH表示可以在CMAKE_FIND_ROOT_PATH下找,也可以在系统目录下找

NEVER表示不查找

3.生成Makefile

[weishusheng@localhost 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),于是添加定义

[weishusheng@localhost 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库路径

[weishusheng@localhost 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

[weishusheng@localhost fl-easycwmp]$ git clone git://nbd.name/uci.git ./uci

2.修改CMakeList.txt

[weishusheng@localhost 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

[weishusheng@localhost 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

[weishusheng@localhost 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

[weishusheng@localhost 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指定库文件

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

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

uclibcgnueabi/sysroot/usr/include/json
[weishusheng@localhost json-c]$

六、安装microxml

1.获取源文件

[weishusheng@localhost fl-easycwmp]$ git clone git://dev.freecwmp.org/microxml ./microxml

2、建立build.sh文件

[weishusheng@localhost 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.执行

[weishusheng@localhost microxml]$ sh build.sh

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

七、最后终于要编译easycwmp了

1.获取源文件

[weishusheng@localhost fl-easycwmp]$ wget http://easycwmp.org/download/easycwmp-1.0.5.tar.gz

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

[weishusheng@localhost fl-easycwmp]$ cp ../cross_easycwmp/easycwmp-1.0.5.tar.gz .

[weishusheng@localhost fl-easycwmp]$ mv easycwmp-1.0.5 easycwmp
[weishusheng@localhost fl-easycwmp]$ cd easycwmp

3.生成makefile

[weishusheng@localhost easycwmp]$ autoreconf -i

3.生成makefile

[weishusheng@localhost 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/myfl2440/cwmp/fl-easycwmp/install MICROXML_CFLAGS="-I/home/weishusheng/myfl2440/cwmp/fl-easycwmp/install/include -D_THREAD_SAFE -D_REENTRANT" MICROXML_LIBS="-L/home/weishusheng/myfl2440/cwmp/fl-easycwmp/install/lib -lmicroxml -lpthread" --enable-debug --enable-devel --enable-acs=multi --enable-jsonc=1 --with-uci-include-path=/home/weishusheng/myfl2440/cwmp/fl-easycwmp/uci/

4.[weishusheng@localhost easycwmp]$ make

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

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

       b、[weishusheng@localhost include]$ sudo mkdir /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux- 

uclibcgnueabi/sysroot/usr/include/curl

               c、[weishusheng@localhost 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.把头文件复制到相应位置          

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

[weishusheng@localhost 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
解决办法:

[weishusheng@localhost ubus]$ pwd
/home/weishusheng/fl-easycwmp/ubus
[weishusheng@localhost 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
解决办法:

[weishusheng@localhost ubus]$ pwd
/home/weishusheng/cross_easycwmp/ubus

[weishusheng@localhost 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

解决办法:

[weishusheng@localhost 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)

[weishusheng@localhost easycwmp]$ make

[weishusheng@localhost easycwmp]$ make install

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

easycwmp的交叉编译的更多相关文章

  1. easycwmp在开发板上的配置

    原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...

  2. easycwmp的编译

    原创作品,转载请注明出处,严禁非法转载. copyright:weishusheng   2015.3.18 email:642613208@qq.com 注:此处的编译指的是直接用系统自带的gcc编 ...

  3. tr069开源协议EasyCwmp移植

    1.平台MT7628 2.交叉编译器及版本信息mipsel-linux + buildroot-gcc463_32bits.tar.bz2 3.创建工作目录lancer@ubuntu:~$ mkdir ...

  4. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

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

    闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充 ...

  6. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  7. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  8. FFmpeg和X264的交叉编译环境

    在下载好了FFmpeg和X264的源码包之后,在Linux下进行安装的基本流程就是切换到其源码的根目录,然后以此执行以下命令.基本上所有的开源源码包的默认编译安装都是这三步. ./configure ...

  9. Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程)

    Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程) 声明:本教程在参考了以下博文,并经过自己的摸索后实际操作得出,本教程系本人原创,由于升级 ...

随机推荐

  1. 你可能不知道的iOS冷知识——#pragma

    Mattt Thompson撰写. Zihan Xu翻译. 发布于2012年10月1日 #pragma 声明是彰显 Objective-C 工艺的标志之一.虽然 #pragma 最初的目的是为了使得源 ...

  2. Object.notifyAll()

    void java.lang.Object.notifyAll() Causes all threads which are waiting on this object's monitor (by ...

  3. Quartz Core框架之core animation

    1.时间功能 (1)CFTimeIntervalCACurrentMediaTime ( void ); :返回当前的绝对时间 2.转换功能 (1)bool CATransform3DIsIdenti ...

  4. [转] js深拷贝和浅拷贝

    一.数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致 ...

  5. GridView获取CheckBox的值及所在列的ID

    //根据GridView的列数进行循环 ; i < GridView1.Rows.Count; i++) { //检查是否有ID为CheckBox1的CheckBox控件,如果有就赋值给Chec ...

  6. 对git的理解及常用指令

    以前总听说git[分布式版本控制系统]自己愣是搞不懂它到底要干哈-什么叫版本控制系统根本理解不了.现在工作需要必须要用到,结果好像就突然懂了git是干什么滴. 所以!原理这个东西的理解是要建立在大量的 ...

  7. 分析一个delphi程序

    系统 : Windows xp 程序 : k4n6 程序下载地址 :https://pan.baidu.com/s/1pLANxyj 要求 : 注册机编写 使用工具 : OD & DeDe 可 ...

  8. HDU4010 (动态树)

    Problem Query on The Trees 题目大意 给一棵树,有点权,要求维护4种操作. 操作1:加一条边. 操作2:删一条边. 操作3:将一条路径上的点权增加w. 操作4:询问一条路径上 ...

  9. Maven学习笔记(1)之安装Maven

    此笔记是学习Maven时自己摸索+各种百度而来,并非全部原创,望与各位一同学习,勿拍~勿拍~ 安装步骤 1.下载Maven的最新版本,地址:http://maven.apache.org/downlo ...

  10. 一周学会go语言并应用 by王奇疏

    <一周学会go语言并应用> by王奇疏 ( 欢迎加入go语言群: 218160862 , 群内有实践) 点击加入 零.安装go语言,配置环境及IDE 这部分内容不多,请参考我的这篇安装环境 ...