今天看到有人在Qtcn.org給我留言問我QSsh的botan在android和ios 的arm下編譯不經過,我就去測試了下,果真是(若是 哪位哥們看到,我道個歉,前天發的,今天才看到)。之前只在win和linux下,果真arm有問題。我就去差了下緣由是Botan不一樣平臺,比同cpu 和編譯器的配置不一樣的。html
因此我就去看了下QSsh用的botan的用法,他是把botan的配置那麼多宏在botan.pri下根據平臺和編譯器進行不少定義的。仔細看了 看那麼多的宏和判斷,並且加上我對botan不是十分的熟悉,就不敢妄自更改他的配置。我也就想了個偷懶的方法,去替換掉QSsh用的Botan,直接用 本身官方下載的Botan替換掉QSsh裏的Botan。python
下面說下個人作法:linux
一、先去下載Botan庫,下載地址:http://botan.randombit.net/download.html 注意,請下載最新穩定版的,1.10.8,開發板的1.11.9我第一步就沒經過的。android
二、進行botan配置,也就是執行「configure.py」輸入參數進行配置,我是選擇把全部算法生成統一的botan_all文件的。附上配置參數:ios
ARM V5的:算法
./configure.py --gen-amalgamation --cpu=arm/armv5 --os=linux --cc=gcc --with-tr1=none
若是你是win的話,應該是:shell
python configure.py --gen-amalgamation --cpu=arm/armv5 --os=linux --cc=gcc --with-tr1=none
ARMV7-A的:架構
./configure.py --gen-amalgamation --cpu=arm/armv7-a --os=linux --cc=gcc --with-tr1=none
Python須要是2.5+,我用的2.7,3.x的我不清楚,您能夠試下。dom
此處參考:http://www.tiwoc.de/blog/2013/03/building-the-botan-library-for-android/ssh
參數的意思我說下,
–gen-amalgamation : 生成聚合的botan_all文件的。
–cpu=arm/armv7-a : CPU的類型,arm/armv7-a 是咱們用armv7-a的CPU,若是是X86/Atom或者mips的,你只須要制定其餘的類型就行。
–os=linux : 操做系統類型,Android是基於Linux,因此這個是linux
–cc=gcc : 編譯器系統,這兒是gcc,
–with-tr1=none :這個參數,好像是必須的,若是沒這個參數是會有一個asm裏的彙編錯誤,我那能力更改,就加上了。上面參考裏的解釋是:當用STLport或者其餘替代GNU STL時,這個參數是必須的,我記得Android Ndk的STL是谷歌本身實現的,不是GNU STL。
此時你執行完命令,應該會在Botan的源碼目錄看到botan_all.h 和botan_all.cpp這兩個文件,這兩個是咱們須要的。
三、配置QSsh源碼,替換掉QSsh裏的Botan。
1) 禁用QSsh自帶的Botan,把src/libs/ssh/ssh.pro裏在最後一句話:
include(../3rdparty/botan/botan.pri)
刪除或者註釋掉(註釋是在這句話最前面加上#)。
2) 添加本身的Botan文件,這個能夠有不少作法,我是直接加到工程裏,編譯到QSsh裏。個人作法是:
把botan_all.h和botan_cpp複製到/src/libs目錄下,而後 在src/libs/ssh/ssh.pro裏添加上這兩個文件,建議你在Qt-C操做,直接在ssh下右鍵,添加現有文件。若是是本身改文件,就 SOURCES = 這個參數里加上../botan_all.cpp,HEADERS = 參數里加上../botan_all.h
3) 更改QSsh裏引用的頭文件,建議直接用QSsh操做。打開工程後,下面高級搜索(Search Results)裏,搜索
#include <botan/botan.h>
,選擇搜索並替換,所有替換爲:
#include "../botan_all.h"
4) 選擇你的項目套件爲android對應的架構,開始編譯吧。
5) 在編譯中我遇到了botan錯誤的,你應該也會遇到,錯誤的行數在2w多行,錯誤的那句話是:
return std::make_pair<struct dirent*, std::string>(dir, m_cur_dir.second);
這個是使用make_pair有點問題,把中間的<struct dirent*, std::string>刪除便可,註釋也行,個人更改是:
std::make_pair/*<struct dirent*, std::string>*/(dir, m_cur_dir.second);
一樣,同在這一個函數,還有幾個此類的錯誤,只是不更改也沒問題。
這樣你編譯應該就沒問題了、、編譯是經過的,只是我沒有測試QSsh在android下的使用,若有問題能夠在一塊兒探討。
對,附上個人環境:
但願你們去源地址支持下我、、哈哈、、
http://www.dushibaiyu.com/2014/07/qssh%E4%B9%8Bandroid%E7%89%88%E7%BC%96%E8%AF%91.html