PC,树莓派,安卓的miracl库环境配置
前言
此篇文章的目的是详细介绍一下miracl库在x86,树莓派4B,安卓手机上的环境配置,按本文章配置完成后就可以直接在PC运行使用miracl库的c++代码,并且将相同代码移植到树莓派4B,安卓手机上,方便把精力更多的放在代码本身而不是环境配置上。文章是我与李慧琳师姐合作完成,感谢师姐领我入坑以及提供的海量技术支持~
关键词:交叉编译,adb,visualgdb,visual studio
x86 miracl库环境配置(visual studio)
x86环境配置分为三个部分:
- 编译miracl.lib
- 导入vs
- 运行测试代码
软件要求
visual studio 2022(windwos社区版),地址:https://visualstudio.microsoft.com/vs/community/,vs需要安装的组件如下(包括了下面编译调试树莓派和安卓需要的组件):
miracl7.0.0源代码,github地址:https://github.com/miracl/MIRACL
配置过程
下载miracl库
github地址:https://github.com/miracl/MIRACL新建个文件夹,可以命名为
miracl
,然后把解压的所有文件都复制miracl
中MIRACL-master中二级、三级目录中的文件要一块拷出来复制进去,最后
miracl
文件夹中只有文件,没有其他文件夹进到vs安装目录
\VS\VC\Auxiliary\Build
中,比如我的是D:\software\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build
shift+右键,打开cmd(管理员模式),执行
vcvars32.bat
返回到
miracl
文件夹执行
ms32doit.bat
,运行完之后在miracl
文件夹里面看到一个miracl.lib文件然后将miracl库导入vs项目,新建一个c++空项目
在项目文件中创建一个cpp文件,名字随意,我这里创建了一个
test.cpp
,文件内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using namespace std;
Miracl precision(500, 10); // This makes sure that MIRACL
// is initialised before main() // is called
void main()
{ /* calculate factorial of number */
Big nf = 1; /* declare "Big" variable nf */
int n;
cout << "factorial program\n";
cout << "input number n= ";
cin >> n;
while (n > 1)
nf *= (n--); /* nf=n!=n*(n-1)*(n-2)*....3*2*1 */
cout << "n!= " << nf << "\n";
}移动需要的文件:
将
MIRACL-master
中(注意不是miracl
文件夹)的include
文件夹里面需要的.h文件放到项目文件夹中的include
文件夹中,比如我目前只需要以下三个文件:1
2
3big.h //看你代码里面需不需要
mirdef.h //必选
miracl.h //必选将
MIRACL-master
中source
里面需要的cpp文件拷到项目文件夹中的source
中,我的项目文件夹里面只放了以下一个文件:1
big.cpp
将
miracl
文件夹中的mircal.lib复制到项目文件夹中
右键项目-属性-配置属性-C/C++-常规-附加包含目录,添加
include
同样在项目属性页面-连接器-常规-附加库目录添加
source
同样在项目属性页面-连接器-输入-附加依赖添加
miracl.lib
把对应的头文件和cpp文件还有lib文件添加到项目里,如图所示
运行,结果如下图所示:
树莓派环境配置(visualGDB)
树莓派环境配置目标是将windows的代码移植过来,分为五个部分:
- 安装visualGDB
- 给树莓派安装操作系统
- 编译miracl.a
- 导入vs
- 运行测试代码
软件/硬件要求
visual studio 2022(windwos社区版),地址:https://visualstudio.microsoft.com/vs/community/,vs需要安装的组件如下(包括了下面编译调试安卓需要的组件):
miracl7.0.0源代码,github地址:https://github.com/miracl/MIRACL
- visualGDB,地址:https://visualgdb.com/download/
- 树莓派操作系统和对应的交叉编译器,地址:www.gnutoolchains.com/raspberry64/
- finalshell,用于ssh链接。地址:https://www.hostbuf.com
- 树莓派镜像工具,用于安装操作系统,地址:https://www.raspberrypi.com/software/
配置过程
使用visualGDB配置树莓派环境时必须保证树莓派系统和交叉编译版本一一对应,对于树莓派4B来说,可以直接从这个网址下载树莓派系统和交叉编译器:
https://gnutoolchains.com/raspberry64/英文教程在这里:gnutoolchains.com/raspberry/tutorial/
安装visualGDB,这个是付费软件,可以试用,也可以破解,此处不讨论破解过程,软件安装地址:https://visualgdb.com/download/,安装完后vs应该可以新建visualGDB项目
安装交叉编译器,注意安装目录不能有空格或者中文,比如我安装到了
D:\SysGcc
把树莓派的sd卡插到电脑上
下载树莓派镜像工具并安装后管理员身份运行,点击
选择操作系统
-使用自定义镜像
-选择刚才下载的zip镜像点击设置,配置ssh(重要,不搞这个你得自己接个显示器然后在树莓派上配置),用户名,密码。
确认sd卡无误(别装错地方啦)之后就可以点
烧录
,开始安装操作系统安装完后树莓派开机,配置ssh,记下树莓派的ip地址,用finalshell登陆root账户
接下来开始在树莓派上面编译miracl.a库,毕竟代码可以交叉编译,静态库还是要自己整一下的,先在https://github.com/HPShark/MIRACL-raspbian中下载zip包,在通过finalshell上传到树莓派里。
cd到压缩包所在位置,比如我是
cd /home/code
,新建一个miracl文件夹,一会在visualGDB中导入要用1
mkdir miracl
然后在ssh终端中执行以下代码:
1
2
3
4
5
6
7apt install unzip # 安装解压软件
cp MIRACL-raspbian-master.zip miracl/
chmod -R 777 miracl
cd miracl
unzip -j -aa -L MIRACL-raspbian-master.zip # 如果有提示选[A]ll就行
cd .. && chmod -R 777 miracl && cd miracl
./linux-raspbian然后等上几分钟,就编译好了,按修改时间排下序可以找到
miracl.a
和mirdef.h
,把这俩文件下载下来备着,下面一步要用然后接下来新建visualGDB项目
新建一个linux Project Wizard,点击add
配置如图,选择next
在这个页面选择第三步安装的交叉编译器目录,并连接ssh后点finish测试链接
如果提示gdb-server未安装的话,执行自动安装就行。
(运行太快没截上图orz)链接树莓派上编译好的miracl.a静态库,对项目右键-
visualGDB Project Properties
-MSBuild Settings
,点Build Tools里面右侧Synchronize sysroot点击 synchronize directories右侧的添加,然后在找到第10步键的miracl目录
就会多出来一个目录,点击Synchronize
因为是将windows代码移植到树莓派,所以把windows的代码(我这里直接将windows代码test.cpp替换至testArm.app内),include,source都复制过来即可,同时要把第11步中的
mirdef.h
文件替换到include中,将miracl.a
放到根目录下,最终目录如下:对项目右键-
visualGDB Project Properties
-MSBuild Settings
,需要填一些额外配置信息:- 在Common Build Settings 中的 Include Directories内填
include
- 在Common Build Settings 中的Library Names内填
source
- 在Common Build Settings 中的Additional Linker Inputs填写miracl.a的绝对地址
- 在Common Build Settings 中的 Include Directories内填
运行代码,结果如下图所示:
注意事项
如果有其他输入输出文件,需要把文件拷至二进制文件所在目录。
比如windows上的代码需要读取
pubilc.key
文件,那得把pubilc.key
文件拷贝到树莓派二进制文件存放地址,这个地址得看第15步中的folder,比如我的是/tmp,那就说明交叉编译的二进制文件存放在树莓派的/tmp文件夹下,然后得手动pubilc.key
文件拷过去才能正常运行。如果有权限问题还需要手动赋权1
chmod 777 public.key
如果运行出现错误,多半是因为miracl文件夹的绝对位置与树莓派不一致,或者windows上的代码运行时需要读取的文件没加进来。
安卓环境配置(visualGDB)
安卓的环境配置目标同样是将windows的代码移植过来,但我的手机(红米K30U)和树莓派都是armv8的,所以就把树莓派上的二进制文件移植过去就好,分为五个部分:
- 手机安装termux,anlinux
- 电脑adb调试连接手机
- 把树莓派的miracl库拷贝到手机上的相同位置
- 拷贝树莓派内编译好的二进制文件到手机内,赋予+x权限并执行
软件/硬件要求
安卓手机需要通过google play安装termux, anlinux
需要梯子,其他下载来源不保证测试通过
电脑上准备adb调试软件,我是直接用了QtScrcpy,地址:https://github.com/barry-ran/QtScrcpy
会adb链接指令可以直接用adb自己链接,这个软件可以一建链接,只需要adb push就行。
配置过程
手机安装好temux后进入软件,第一次可能需要初始化,进入终端后退出,然后打开anlinux,会显示仪表板,然后选择系统
选择第一个ubuntu,点确定。
点击复制,然后切换回termux,粘贴命令并回车执行。
运行完后在termux执行以下代码获取系统文件权限
1
termux-setup-storage # 申请获取系统文件权限
编辑
start-ubuntu.sh
文件,将#command+=" -b /sdcard"
取消注释1
2
3
4
5
6vim start-ubuntu.sh
# 按 i 进入编辑模式
# 删除#号
command+=" -b /sdcard
# 按esc退出编辑模式
输入:wq保存退出(如果改错了输入:q!强制退出)
继续执以下代码,进入root@ubuntu环境
1
./start-ubuntu.sh
继续执行以下代码,将系统存储的Download文件夹映射至ubuntu 的share文件夹中
1
ln -s /sdcard/Downloads ./share
下面把miracl库导入Ubuntu系统。通过finalshell把miracl文件夹(第二部分第十步)下载下来
右键-复制文件地址
下载好QtScrcpy,打开先连接手机
然后直接关掉,在Qtscrcpy文件夹里右键-在终端中打开,输入以下代码将miracl文件夹存入手机系统存储的Download文件夹中,其中miracl地址是第8步中复制的地址
1
adb push "C:\Users\CrazyBoomYangcong\Desktop\fsdownload\miracl" /sdcard/Download
返回手机,继续输入以下命令将share文件夹中的miracl文件夹拷贝至/home/code文件夹中,然后在赋权
/home/code这个绝对路径必须和第二部分第10步保持一致
1
2
3
4midir /home/code
cp -r share/miracl /home/code/
chmod -R 777 /home/code/miracl
ls /home/code以上步骤就将手机Ubuntu的环境配置好了,下面将树莓派里的二进制文件拷贝到手机中运行,在finalshell中定位至/tmp文件夹,把里面的二进制文件还有所有的引用文件全下载下来
然后同第10步一致,把所有文件复制到手机存储中的Download文件夹中
在手机的Ubuntu终端上使用cp命令将所有文件从share文件夹拷贝至本地,并赋权。这里我只有一个二进制文件testArm和一个引用文件public.key
不可以直接在share文件夹中运行,会报错
1
2
3
4cp share/testArm .
cp share/public.key .
chmod 777 testArm
chmod 777 public.key运行以下命令执行二进制文件
1
./testArm
注意事项
- 如果手机root那么可以直接adb shell执行二进制文件,我的手机没有root所以只能通过termux曲线救国。
因为使用了miracl库,所以得把visualGDB在树莓派上引用的miracl库的目录(第二部分第10步)位置拷到手机的相同位置上。比如树莓派上我的miracl库位置是
/home/code/miracl
,那我就得把这个文件夹拷到手机上绝对路径相同的地方,同样得是/home/code/miracl
。如果有其他输入输出文件,连同二进制文件一起拷到手机上,方法同树莓派环境配置注意事项第一条一致。
如果运行出现错误,多半是因为miracl文件夹的绝对位置与树莓派不一致,或者windows上的代码运行时需要读取的文件没加进来。
写在最后
所有配置过程不一定是最简洁的,我在配置的过程中也是磕磕绊绊,除了以上的方案其实还有其他办法可以达到相同的效果,所以我的过程仅供参考~如果有问题欢迎留言讨论,文章如果可以有效帮助新入坑miracl的萌新希望可以给你的导师美言几句snnu的禹勇老师手下的娃文档写的不错,如果能传到我导的耳朵里说不定他可以在疯狂星期四v我50吃两个奥尔良鸡腿堡
引用
https://www.aflyingfish.top/articles/407987f7a995/
https://blog.csdn.net/leapoo/article/details/108260941
https://blog.csdn.net/leapoo/article/details/122927101
https://blog.csdn.net/hello_baby6/article/details/117407705
https://blog.csdn.net/langshanglibie/article/details/119788253
https://zhuanlan.zhihu.com/p/441333966
https://learn.microsoft.com/zh-cn/cpp/linux/deploy-run-and-debug-your-linux-project?view=msvc-170
https://zhuanlan.zhihu.com/p/433896930
https://www.cpp-prog.com/%E7%BC%96%E7%A8%8B/Cross-Compile-Raspberry-Pi/
https://crosstool-ng.github.io/
https://blog.csdn.net/qq_32312307/article/details/114907522
https://gist.github.com/AndySze/5434903#1%E4%B8%8B%E8%BD%BDct-ng%E6%BA%90%E7%A0%81
https://blog.csdn.net/Jymman/article/details/105105570
https://www.leoxiaofei.com/build-arm-windows.html
https://gnutoolchains.com/raspberry/tutorial/
https://gnutoolchains.com/raspberry/tutorial/sysroot
https://visualgdb.com/tutorials/raspberry/
https://visualgdb.com/tutorials/raspberry/crosscompiler/
https://zhuanlan.zhihu.com/p/58949515
https://zhuanlan.zhihu.com/p/56030172
https://zhuanlan.zhihu.com/p/58920282
https://ilyas-hamadouche.medium.com/build-your-c-projects-faster-using-ninja-3d7af9b418fc
https://zhuanlan.zhihu.com/p/157362239
https://zhuanlan.zhihu.com/p/66735155
https://cloud.tencent.com/developer/article/1592277
https://github.com/miracl/MIRACL/issues/97
https://zhuanlan.zhihu.com/p/336980673
https://www.cnblogs.com/robinex/p/7858410.html
https://blog.csdn.net/wangzhiyu1980/article/details/16972937
https://github.com/Innovativaltd/RiskAdjustedReturn
https://zhuanlan.zhihu.com/p/56530788
https://blog.csdn.net/afei__/article/details/80719691
https://blog.csdn.net/hdanbang/article/details/49403137
https://blog.csdn.net/afei__/article/details/80720602
https://visualgdb.com/android/tools
https://blog.csdn.net/u010144805/article/details/78767694
https://visualgdb.com/tutorials/android/tests/
https://visualgdb.com/KB/?ProblemID=host64
https://blog.csdn.net/qq_34508943/article/details/113032733
https://blog.csdn.net/u010801248/article/details/73331484
https://www.jianshu.com/p/c5b59cbe65f7
https://stackoverflow.com/questions/9721856/unable-to-include-iostream-in-android-why
https://learn.microsoft.com/zh-cn/xamarin/android/get-started/installation/android-emulator/device-manager?tabs=windows&pivots=windows
https://learn.microsoft.com/zh-cn/xamarin/android/deploy-test/debugging/debug-on-emulator?tabs=windows
https://www.fity.cn/post/509.html
https://cloud.tencent.com/developer/article/1736604
https://blog.csdn.net/sinat_28442665/article/details/84136133
https://wiki.termux.com/wiki/PRoot#Installing_Linux_distributions
https://zhuanlan.zhihu.com/p/95865982
https://github.com/kimud6003/MIRACL-raspbian/tree/Raspbian