調試經驗--交叉編譯

來源:互聯網
上載者:User

調試經驗--交叉編譯

嵌入式開發,通常由於嵌入式環境的資源較少,只能夠存放運行環境,所以將資源需求較大的開發環境都存放在PC上。這種情況,由於開發環境與運行環境不一致,所以就出現了交叉編譯--即在開發環境下,編譯出能在運行環境上啟動並執行可執行程式。具體到davinci開發,其交叉編譯過程就是在x86的linux系統下,編譯出在davinci平台上linux系統下啟動並執行可執行程式。

下面介紹了交叉編譯的幾個執行個體:
1,交叉編譯一個驅動模組;
2,網路測試載入器軟體Iperf的交叉編譯;
3,交叉編譯activeMQ-cpp。

一、交叉編譯一個驅動模組

交叉編譯驅動模組,非常類似於直接編譯驅動模組,區別只在於核心路徑不同,修改為交叉編譯環境的核心原始碼路徑即可。
另外需要注意兩點:
1,核心原始碼需要是編譯過的,否則可能會遇到找不到某些標頭檔的錯誤。
2,目標檔案名需要與.c檔案名稱一致。

更詳細的操作樣本,參見我前面的一篇文章《Linux裝置驅動學習-Davinci開發板上啟動並執行hello模組》。

二、網路測試載入器軟體Iperf的交叉編譯

Iperf 是一個網路效能測試工具,可以測試最大TCP和UDP頻寬效能,資料包丟失情況等,Iperf既可以測試網路發送效能,也可以測試網路接收效能。

Iperf是一個開源軟體,如下:
http://sourceforge.net/projects/iperf/

iperf是使用autoconf配置的makefile ,在linux下本地編譯可以直接編譯成功。

在linux下交叉編譯到dm6467上運行,步驟如下:

1,配置編譯工具的路徑,如CROSS_COMPILE、CC、CXX、AR、RANLIB、NM、AS、LD、ARCH等。
2,在運行configure時指定 --host=arm-linux
3,在config.h.in中屏蔽一句:#undef malloc

關於前2步,我們通常是將其統一到一個執行指令碼(例如命名為configure_cross)裡面,在編譯前配置時執行一次即可,具體內容如下:

export CROSS_COMPILE=/opt/mv_pro_4.0.1/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export NM=${CROSS_COMPILE}nm
export AS=${CROSS_COMPILE}as
export LD=${CROSS_COMPILE}ld
export ARCH=arm

./configure --host=arm-linux --prefix=/root/armfs_6467/usr/local/

說明:
CROSS_COMPILE 指示交叉編譯路徑及首碼,根據實際情況調整。
--prefix 指示最終組建檔案的存放路徑,根據實際情況調整。我這裡設定的路徑 /root/armfs_6467 是一個nfs檔案系統對應的路徑,用於嵌入式裝置遠端存取,作為嵌入式裝置中Linux的根路徑。


三、交叉編譯activeMQ-cpp

一般的應用程式,進行交叉編譯,參考Iperf的交叉編譯,就可以解決問題了。這裡之所以再說明一下activeMQ-cpp的交叉編譯,實在是其依賴太多了,編譯過程非常複雜。

ActiveMQ 是Apache出品,比較流行的,能力強勁的開源訊息匯流排。
它支援多種語言和協議編寫用戶端,例如有使用c++編寫的用戶端,即我們使用的activeMQ-cpp。

1,下載ActiveMQ-CPP,其如下:
http://activemq.apache.org/cms/

2,查看依賴關係:
我下載的是 activemq-cpp-library-3.1.0 ,查看其 README.txt 中的 Dependencies,依賴非常多,具體如下:

Tool Recommended Version
-------------------------------
autoconf >= 2.61
automake >= 1.10
libtool >= 1.5.24
APR >= 1.3*
APR-Util >= 1.3* or higher
CPPUnit >= 1.10.2*
libuuid >= ?*

這是已經列出來的,在我實際編譯過程中,還發現autoconf在產生“configure”指令碼時還依賴於m4。
另外,libuuid不能直接下載,它是包含在e2fsprogs中。

3,下載ActiveMQ-CPP編譯啟動並執行依賴工具與庫:
autoconf: http://www.gnu.org/software/autoconf/
m4: http://www.gnu.org/software/m4/
automake: http://www.gnu.org/software/automake/
libtool: http://www.gnu.org/software/libtool/
cppunit: http://sourceforge.net/projects/cppunit/
apr與apr-util都在一個網站上可以找到相應下載點:http://apr.apache.org/
libuuid: http://sourceforge.net/projects/e2fsprogs/

4,先不著急交叉編譯,在PC上的linux下編譯一遍。基本步驟是,先準備好編譯工具(如autoconf、m4、automake),再編譯依賴庫,最後編譯ActiveMQ-CPP庫。

5,在PC上測試回合。這裡測試也比較容易,因為開發人員實在考慮得周全,將測試代碼已經準備好了。
測試ActiveMQ-CPP庫是否編譯成功:
make check
然後可以進行整合測試,當然,這時需要搭建ActiveMQ伺服器,本文不做介紹,網上有相關介紹。
cd src/test-integration
./activemq-test-integration

6,PC上本地編譯測試通過之後,再開始交叉編譯。此時各原始碼都需要交叉編譯,除了只是在PC上產生進一步編譯指令碼的3個工程不需要重新編譯。不需要交叉編譯的3個工程是:
autoconf,m4,automake。

交叉編譯,與本地編譯比較,最大的差異,就是使用Iperf的交叉編譯時間的指令碼configure_cross來替代configure。

另外還有一些小的差異:
如apr,apr-util,amq-cpp,都需要修改configure的參數。
apr的最後一句指令碼修改:
./configure --host=arm-linux --prefix=/root/armfs_6467/usr/local/ ac_cv_file__dev_zero="yes" ac_cv_func_setpgrp_void="yes" apr_cv_process_shared_works="yes" apr_cv_mutex_robust_shared="no" apr_cv_tcp_nodelay_with_cork="yes" ac_cv_sizeof_struct_iovec="8" apr_cv_mutex_recursive="yes"
apr-util的最後一句指令碼修改:
./configure --host=arm-linux --prefix=/root/armfs_6467/usr/local --with-apr=/root/armfs_6467/usr/local CPPFLAGS=-I/root/armfs_6467/usr/include LDFLAGS=-L/root/armfs_6467/usr/lib
並且apr_util的makefile 需要修改 -lexpat 為指定libexpat.so的全路徑。

ActiveMQ-CPP的最後一句指令碼修改:
./configure --host=arm-linux --prefix=/root/armfs_6467/usr/local/ --with-apr=/root/armfs_6467/usr/local --with-apr-util=/root/armfs_6467/usr/local

並且ActiveMQ-CPP可能還涉及某些內部makefile的修改(也可能是我的某些配置沒配好?)。
另外,MQ-cpp目錄下的libtool,需要用交叉編譯出來的libtool替換。

7,考慮到測試,需要將源檔案中的伺服器IP改動為實際MQ伺服器IP。

8,產生的庫檔案libactivemq-cpp.so非常大,都超過100M,在嵌入式環境下完全不能接受。運行arm_v5t_le-strip,縮小尺寸。

9,測試相關的simple_async_consumer、simple_producer檔案也需要相應配置路徑。

10,都編譯完成,就啟動嵌入式裝置,測試回合一下吧。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.