今天看到有人在Qtcn.org给我留言问我QSsh的botan在android和ios 的arm下编译不通过,我就去测试了下,果然是(如果 哪位哥们看到,我道个歉,前天发的,今天才看到)。以前只在win和linux下,果然arm有问题。我就去差了下原因是Botan不同平台,比同cpu 和编译器的配置不同的。
所以我就去看了下QSsh用的botan的用法,他是把botan的配置那么多宏在botan.pri下根据平台和编译器进行很多定义的。仔细看了 看那么多的宏和判断,而且加上我对botan不是十分的熟悉,就不敢妄自更改他的配置。我也就想了个偷懒的方法,去替换掉QSsh用的Botan,直接用 自己官方下载的Botan替换掉QSsh里的Botan。
下面说下我的做法:
1、先去下载Botan库,下载地址:http://botan.randombit.net/download.html 注意,请下载最新稳定版的,1.10.8,开发板的1.11.9我第一步就没通过的。
2、进行botan配置,也就是执行“configure.py”输入参数进行配置,我是选择把所有算法生成统一的botan_all文件的。附上配置参数:
ARM V5的:
./configure.py --gen-amalgamation --cpu=arm/armv5 --os=linux --cc=gcc --with-tr1=none
如果你是win的话,应该是:
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的我不清楚,您可以试下。
此处参考:http://www.tiwoc.de/blog/2013/03/building-the-botan-library-for-android/
参数的意思我说下,
–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这两个文件,这两个是我们需要的。
3、配置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