前言

此篇文章的目的是详细介绍一下miracl库在x86,树莓派4B,安卓手机上的环境配置,按本文章配置完成后就可以直接在PC运行使用miracl库的c++代码,并且将相同代码移植到树莓派4B,安卓手机上,方便把精力更多的放在代码本身而不是环境配置上。文章是我与李慧琳师姐合作完成,感谢师姐领我入坑以及提供的海量技术支持~

关键词:交叉编译,adb,visualgdb,visual studio

x86 miracl库环境配置(visual studio)

x86环境配置分为三个部分:

  • 编译miracl.lib
  • 导入vs
  • 运行测试代码

软件要求

配置过程

  1. 下载miracl库
    github地址:https://github.com/miracl/MIRACL

  2. 新建个文件夹,可以命名为miracl,然后把解压的所有文件都复制miracl

    MIRACL-master中二级、三级目录中的文件要一块拷出来复制进去,最后miracl文件夹中只有文件,没有其他文件夹

    image-20230403161607009

  3. 进到vs安装目录\VS\VC\Auxiliary\Build中,比如我的是D:\software\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build

  4. shift+右键,打开cmd(管理员模式),执行vcvars32.bat
    image-20230403162232003

  5. 返回到miracl文件夹

    image-20230403162732823

  6. 执行ms32doit.bat,运行完之后在miracl文件夹里面看到一个miracl.lib文件

    image-20230403163049893

  7. 然后将miracl库导入vs项目,新建一个c++空项目
    image-20230403163610830

  8. 在项目文件中创建一个cpp文件,名字随意,我这里创建了一个test.cpp,文件内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include "big.h"
    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";
    }
  9. 移动需要的文件:

    • MIRACL-master中(注意不是miracl文件夹)的include文件夹里面需要的.h文件放到项目文件夹中的include文件夹中,比如我目前只需要以下三个文件:

      1
      2
      3
      big.h //看你代码里面需不需要
      mirdef.h //必选
      miracl.h //必选
    • MIRACL-mastersource里面需要的cpp文件拷到项目文件夹中的source中,我的项目文件夹里面只放了以下一个文件:

      1
      big.cpp
    • miracl文件夹中的mircal.lib复制到项目文件夹中
      image-20230403175117842

  10. 右键项目-属性-配置属性-C/C++-常规-附加包含目录,添加include
    image-20230403165108384

  11. 同样在项目属性页面-连接器-常规-附加库目录添加source
    image-20230403174039743

  12. 同样在项目属性页面-连接器-输入-附加依赖添加miracl.lib

    image-20230403174138812

  13. 把对应的头文件和cpp文件还有lib文件添加到项目里,如图所示
    image-20230403175138383

  14. 运行,结果如下图所示:
    image-20230403175352165

树莓派环境配置(visualGDB)

树莓派环境配置目标是将windows的代码移植过来,分为五个部分:

  • 安装visualGDB
  • 给树莓派安装操作系统
  • 编译miracl.a
  • 导入vs
  • 运行测试代码

软件/硬件要求

配置过程

使用visualGDB配置树莓派环境时必须保证树莓派系统和交叉编译版本一一对应,对于树莓派4B来说,可以直接从这个网址下载树莓派系统和交叉编译器:
https://gnutoolchains.com/raspberry64/

英文教程在这里:gnutoolchains.com/raspberry/tutorial/

  1. 安装visualGDB,这个是付费软件,可以试用,也可以破解,此处不讨论破解过程,软件安装地址:https://visualgdb.com/download/,安装完后vs应该可以新建visualGDB项目
    image-20230403200936747

  2. https://gnutoolchains.com/raspberry64/下载操作系统镜像2022-01-28-raspios-bullseye-arm64.zip和交叉编译器安装包raspberry64-gcc10.2.1.exe
    image-20230403180118138

  3. 安装交叉编译器,注意安装目录不能有空格或者中文,比如我安装到了D:\SysGcc

  4. 把树莓派的sd卡插到电脑上

  5. 下载树莓派镜像工具并安装后管理员身份运行,点击选择操作系统-使用自定义镜像-选择刚才下载的zip镜像

  6. 点击设置,配置ssh(重要,不搞这个你得自己接个显示器然后在树莓派上配置),用户名,密码。
    image-20230403194130553
    image-20230403194225575

  7. 确认sd卡无误(别装错地方啦)之后就可以点烧录,开始安装操作系统
    image-20230403181028275

  8. 安装完后树莓派开机,配置ssh,记下树莓派的ip地址,用finalshell登陆root账户

  9. 接下来开始在树莓派上面编译miracl.a库,毕竟代码可以交叉编译,静态库还是要自己整一下的,先在https://github.com/HPShark/MIRACL-raspbian中下载zip包,在通过finalshell上传到树莓派里。

    image-20230403195201255

  10. cd到压缩包所在位置,比如我是cd /home/code,新建一个miracl文件夹,一会在visualGDB中导入要用

    1
    mkdir miracl
  11. 然后在ssh终端中执行以下代码:

    1
    2
    3
    4
    5
    6
    7
    apt 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.amirdef.h,把这俩文件下载下来备着,下面一步要用
    image-20230403200752107

  12. 然后接下来新建visualGDB项目

    image-20230403200936747

  13. 新建一个linux Project Wizard,点击add
    image-20230403201217207

  14. 配置如图,选择next
    image-20230403201232137

  15. 在这个页面选择第三步安装的交叉编译器目录,并连接ssh后点finish测试链接
    image-20230403201456418

  16. 如果提示gdb-server未安装的话,执行自动安装就行。
    (运行太快没截上图orz)

  17. 链接树莓派上编译好的miracl.a静态库,对项目右键-visualGDB Project Properties-MSBuild Settings,点Build Tools里面右侧Synchronize sysroot
    image-20230403202122411

  18. 点击 synchronize directories右侧的添加,然后在找到第10步键的miracl目录
    image-20230403202322149

  19. 就会多出来一个目录,点击Synchronize
    image-20230403202506899

  20. 因为是将windows代码移植到树莓派,所以把windows的代码(我这里直接将windows代码test.cpp替换至testArm.app内),include,source都复制过来即可,同时要把第11步中的mirdef.h文件替换到include中,将miracl.a放到根目录下,最终目录如下:
    image-20230403204156212

  21. 对项目右键-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的绝对地址

    image-20230403204327514

  22. 运行代码,结果如下图所示:
    image-20230403204612829

注意事项

  • 如果有其他输入输出文件,需要把文件拷至二进制文件所在目录。

    比如windows上的代码需要读取pubilc.key文件,那得把pubilc.key文件拷贝到树莓派二进制文件存放地址,这个地址得看第15步中的folder,比如我的是/tmp,那就说明交叉编译的二进制文件存放在树莓派的/tmp文件夹下,然后得手动pubilc.key文件拷过去才能正常运行。如果有权限问题还需要手动赋权

    1
    chmod 777 public.key

    image-20230403231308155

  • 如果运行出现错误,多半是因为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就行。

配置过程

  1. 手机安装好temux后进入软件,第一次可能需要初始化,进入终端后退出,然后打开anlinux,会显示仪表板,然后选择系统

    image-20230403232739125

  2. 选择第一个ubuntu,点确定。

    image-20230403232817983

  3. 点击复制,然后切换回termux,粘贴命令并回车执行。
    image-20230403233151085

  4. 运行完后在termux执行以下代码获取系统文件权限

    1
    termux-setup-storage # 申请获取系统文件权限
  5. 编辑start-ubuntu.sh文件,将#command+=" -b /sdcard"取消注释

    1
    2
    3
    4
    5
    6
    vim start-ubuntu.sh
    # 按 i 进入编辑模式
    # 删除#号
    command+=" -b /sdcard
    # 按esc退出编辑模式
    输入:wq保存退出(如果改错了输入:q!强制退出)

    image-20240307210615907
    image-20240307210734520
    image-20240307210854699

  1. 继续执以下代码,进入root@ubuntu环境

    1
    ./start-ubuntu.sh

    image-20230403233818218

  2. 继续执行以下代码,将系统存储的Download文件夹映射至ubuntu 的share文件夹中

    1
    ln -s /sdcard/Downloads ./share

    image-20230403235230885

  3. 下面把miracl库导入Ubuntu系统。通过finalshell把miracl文件夹(第二部分第十步)下载下来
    image-20230403234020128

  4. 右键-复制文件地址
    image-20230403234146184

  5. 下载好QtScrcpy,打开先连接手机
    image-20230403234326772

  6. 然后直接关掉,在Qtscrcpy文件夹里右键-在终端中打开,输入以下代码将miracl文件夹存入手机系统存储的Download文件夹中,其中miracl地址是第8步中复制的地址

    1
    adb push "C:\Users\CrazyBoomYangcong\Desktop\fsdownload\miracl" /sdcard/Download

    image-20230403234806101

  7. 返回手机,继续输入以下命令将share文件夹中的miracl文件夹拷贝至/home/code文件夹中,然后在赋权

    /home/code这个绝对路径必须和第二部分第10步保持一致

    1
    2
    3
    4
    midir /home/code
    cp -r share/miracl /home/code/
    chmod -R 777 /home/code/miracl
    ls /home/code

    image-20230404000116918

  8. 以上步骤就将手机Ubuntu的环境配置好了,下面将树莓派里的二进制文件拷贝到手机中运行,在finalshell中定位至/tmp文件夹,把里面的二进制文件还有所有的引用文件全下载下来

    image-20230404000552572

  9. 然后同第10步一致,把所有文件复制到手机存储中的Download文件夹中
    image-20230404000724635

  10. 在手机的Ubuntu终端上使用cp命令将所有文件从share文件夹拷贝至本地,并赋权。这里我只有一个二进制文件testArm和一个引用文件public.key

    不可以直接在share文件夹中运行,会报错

    1
    2
    3
    4
    cp share/testArm .
    cp share/public.key .
    chmod 777 testArm
    chmod 777 public.key
  11. 运行以下命令执行二进制文件

    1
    ./testArm

    image-20230404001248816

注意事项

  • 如果手机root那么可以直接adb shell执行二进制文件,我的手机没有root所以只能通过termux曲线救国。
  • 因为使用了miracl库,所以得把visualGDB在树莓派上引用的miracl库的目录(第二部分第10步)位置拷到手机的相同位置上。比如树莓派上我的miracl库位置是/home/code/miracl,那我就得把这个文件夹拷到手机上绝对路径相同的地方,同样得是/home/code/miracl

  • 如果有其他输入输出文件,连同二进制文件一起拷到手机上,方法同树莓派环境配置注意事项第一条一致。

  • 如果运行出现错误,多半是因为miracl文件夹的绝对位置与树莓派不一致,或者windows上的代码运行时需要读取的文件没加进来。

写在最后

所有配置过程不一定是最简洁的,我在配置的过程中也是磕磕绊绊,除了以上的方案其实还有其他办法可以达到相同的效果,所以我的过程仅供参考~如果有问题欢迎留言讨论,文章如果可以有效帮助新入坑miracl的萌新希望可以给你的导师美言几句snnu的禹勇老师手下的娃文档写的不错,如果能传到我导的耳朵里说不定他可以在疯狂星期四v我50吃两个奥尔良鸡腿堡
img

引用

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