easycwmp的交叉編譯

來源:互聯網
上載者:User

標籤:

原創作品,轉載請註明出處

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開發板上跑,在開發板上還要做相關設定,請參考下一遍博文。

 

easycwmp的交叉編譯

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.