1、下載下傳openwrt源碼編譯
貌似版本很多,也不是所有版本都适合我的闆子,是以這點得弄清楚。我下得是barrier_break,支援mt7620a開發闆。按照上面的教程,把該準備的給準備着,具體總結如下:
1.1 目前有三種,v12.09,attitude adjustment,barrier_breaker,貌似中間第二種不支援mt7620
1.2 将下面某一行添加進對應版本的feeds.conf
src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;openwrt_12.09
src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;barrier_breaker
1.3 更新和安裝
./scripts/feeds update -a
./scripts/feeds install -a -p alljoyn
1.4 make menuconfig時按照下圖選擇
當然如果選擇子產品,則生成ipk檔案,如果內建到核心中,則直接刷固件就有了
我們可以在build_dir/target-mipsel-24kec**/下找到alljoyn的相關目錄,裡面的build目錄下有生成好的庫和二進制檔案
2、編寫alljoyn程式
編譯方法和helloworld類似了,我前篇博文有講述,這裡就不說了,我主要列出src檔案夾的makefile
3、交叉編譯
在sdk頂層下編譯程式,成功後在build_dir/target**/ajtest/下有執行程式,scp到闆子上運作。這裡截取一下交叉編譯器的編譯和連結過程,注意觀察用到了哪些目錄下的頭檔案目錄和庫目錄
【編譯】
mipsel-openwrt-linux-uclibc-g++ -os -pipe -mno-branch-likely -mips32r2 -mtune=24kec -mdsp -fno-caller-saves -fhonour-copts -wno-error=unused-but-set-variable
-msoft-float -i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/usr/include
-i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/include-i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/usr/include
-i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/include -c
hello.cpp
【連結】
mipsel-openwrt-linux-uclibc-g++ -l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/usr/lib
-l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/lib -l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/usr/lib
-l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/lib hello.o
-o hello
4、保證闆中已經有了liballjoyn,pthread,librt,ssl等庫,且正确設定了動态庫路徑,執行即可
用ldd檢查可發現加載了哪些動态庫
【插曲一】
從官方路徑中下載下傳的libstdcpp貌似不管用,害得整半天,在執行alljoyn程式時,出現如下錯誤:
經查詢發現它在c++檔案hashtable_c++0x.o中
再對比barrier_breaker上的cpp庫(libstdc++.so.6.0.19)和闆子上的cpp庫(libstdc++.so.6.0.16),發現後者小很多且nm不到任何符号,不如直接替換,讓軟連結libstdc++.so.6指向19版本,看看能不能找到這個符号,果然可以了。
【插曲二】
符号找到了,卻識别不了我pc上的用戶端了。大膽猜測一下,是不是闆子上的防火牆阻擋了?一試,果然是!
正如上圖所示,由于我将闆子連入了另外一個接入外網的路由器,産生了wan區域,将其入口設定為接受即可,這樣,闆子上的alljoyn服務端就可識别pc上的用戶端了(當然要在同一個區域網路内啦)
參考連結