MIRACL库成功配置记录

最近需要使用各种加密、散列算法,又不太想自己写,于是去Google和GitHub上找了一番,发现了MIRACL这个据说很好用的库。用百度搜搜发现还有一篇以此为基础的电子科技大学的硕士论文!吼啊!看起来很不错嘛

于是先去GitHub上下载源代码 点击Download ZIP

下载之后解压,看了一下manual.doc,是关于各种函数以及用法的,翻翻看看发现了几个bat脚本,ms32doit和ms64doit等等,刚开始没看懂什么意思,后来才发现这是MS 32Bit Do It !的意思,意思就是用这个就可以编译了。(没搞明白这个,浪费了大半个小时)

搞明白之后尝试执行ms32doit,一大堆错误,慢慢看发现cl什么的都未找到,应该是VS的配置没有到全局变量里,既然这样那我不如用GCC了(以前配置过cygwin)同时还找到了gcdoit看来就是GCC DO IT!的意思嘛

于是用gcdoit,仍旧一大堆错误。一行行看发现都是编译的时候未找到各种各种。

这个库本身没有MAKE CONFIGURE这样好用的东西,自己不想处理依赖关系,于是开始百度用IDE编译。找到了几篇博客什么的,后来证明这些博客都在胡说八道。

先用CodeBlocks编译miracl,仍旧一大堆错误。尝试手动修改#include导致的问题,后来卡死在miracl.h里面的宏定义上。

后来用Visual Studio 2015编译,一大堆错误。(到这里我已经快疯了...)引入VS之后出现了预编译头的问题,去项目配置里面的C/C++选项卡关掉了预编译头。继续编译仍旧出现各种#include not found的问题。卒。

无奈返回到命令行下开始手动解决这些问题。耐心一点点看根目录的这些txt,最后从txt里面找到了这样一句话:“If using Windows decompress all files into a single DOS directory MIRACL.”。。。好么原来需要解压所有文件到同一文件夹啊!...

照做,过程略

执行gcdoit.bat,没有错误了。

于是我高高兴兴的拿着miracl.a这个文件放到了Codeblocks的lib下,重命名为libmiracl.a。

写了一个简单的测试程序

#include 
using namespace std;

int main()
{
    aes x;
    aes_init(&x,0,0,NULL,NULL);
}
编译,发现miracl.h not found。去原始版本重新解压了一份带文件结构的,复制整个include文件夹到codeblocks的include下,修改文件夹为miracl

重新编译

#include 
using namespace std;

int main()
{
    aes x;
    aes_init(&x,0,0,NULL,NULL);
}
编译通过啦!好开心。然后,连接错误: aes_init not found...

在这个地方又纠结了好久,大概两个多小时,期间我还以为自己前面出问题了退回去重来了好几次。

最终在不知道什么txt里面找到了关于这个问题的解答....

原来需要这么写:

extern "C"
{
    #include 
}
using namespace std;

int main()
{
    aes x;
    aes_init(&x,0,0,NULL,NULL);
}
原因是:虽然miracl支持C++但是本质上仍然是C语言库,所以需要extern "C" 然后include...

对此我只想说,既然您是一个库那为什么不自己配合一下编译器__cplusplus呢(微笑+死亡凝视)

连接的时候加上 -lmiracl即可

以上, WIN平台上配置完成。

然后复制文件到Android上,我的Android平台是ARM,官方提示使用下面的mirdef.h

/*
 *   MIRACL compiler/hardware definitions - mirdef.h
 */


#define MIRACL 32
#define MR_LITTLE_ENDIAN      

/* or possibly 
#define MR_BIG_ENDIAN      
*/

#define mr_utype int
#define MR_IBITS 32
#define MR_LBITS 32
#define mr_dltype long long
#define mr_unsign32 unsigned int
#define mr_unsign64 unsigned long long
#define MAXBASE ((mr_small)1<<(MIRACL-1))


#define MR_NOASM

然后编译脚本用下面这个(官方推荐)

armcc -I. -c -O2 mrcore.c
armcc -I. -c -O2 mrarth0.c
armcc -I. -c -O2 mrarth1.c
armcc -I. -c -O2 mrarth2.c
armcc -I. -c -O2 mralloc.c
armcc -I. -c -O2 mrsmall.c
armcc -I. -c -O2 mrio1.c
armcc -I. -c -O2 mrio2.c
armcc -I. -c -O2 mrgcd.c
armcc -I. -c -O2 mrjack.c
armcc -I. -c -O2 mrbits.c
armcc -I. -c -O2 mrxgcd.c
armcc -I. -c -O2 mrarth3.c
armcc -I. -c -O2 mrrand.c
armcc -I. -c -O2 mrprime.c
armcc -I. -c -O2 mrcrt.c
armcc -I. -c -O2 mrscrt.c
armcc -I. -c -O2 mrmonty.c
armcc -I. -c -O2 mrpower.c
armcc -I. -c -O2 mrsroot.c
armcc -I. -c -O2 mrcurve.c
armcc -I. -c -O2 mrfast.c
armcc -I. -c -O2 mrshs.c
armcc -I. -c -O2 mrshs256.c
armcc -I. -c -O2 mrshs512.c
armcc -I. -c -O2 mraes.c
armcc -I. -c -O2 mrgcm.c
armcc -I. -c -O2 mrlucas.c
armcc -I. -c -O2 mrstrong.c
armcc -I. -c -O2 mrbrick.c
armcc -I. -c -O2 mrebrick.c
armcc -I. -c -O2 mrgf2m.c
armcc -I. -c -O2 mrec2m.c
armcc -I. -c -O2 mrzzn2.c
armcc -I. -c -O2 mrzzn2b.c
armcc -I. -c -O2 mrzzn3.c
armcc -I. -c -O2 mrecn2.c
armar -rc miracl.a mrcore.o mrarth0.o mrarth1.o mrarth2.o mralloc.o mrsmall.o
armar -r  miracl.a mrio1.o mrio2.o mrjack.o mrgcd.o mrxgcd.o mrarth3.o mrgcm.o
armar -r  miracl.a mrrand.o mrprime.o mrcrt.o mrscrt.o mrmonty.o mrcurve.o 
armar -r  miracl.a mrfast.o mrshs.o mraes.o mrlucas.o mrstrong.o mrbrick.o 
armar -r  miracl.a mrebrick.o mrec2m.o mrgf2m.o mrpower.o mrsroot.o mrzzn2b.o
armar -r  miracl.a mrshs256.o mrshs512.o mrbits.o mrzzn2.o mrzzn3.o mrecn2.o
del mr*.o
armcc -I. -c pk-demo.c
armlink pk-demo.o miracl.a -o pk-demo.axf
我稍微修改了一下,以便我自己使用

gcc -I. -c -O2 mrcore.c
gcc -I. -c -O2 mrarth0.c
gcc -I. -c -O2 mrarth1.c
gcc -I. -c -O2 mrarth2.c
gcc -I. -c -O2 mralloc.c
gcc -I. -c -O2 mrsmall.c
gcc -I. -c -O2 mrio1.c
gcc -I. -c -O2 mrio2.c
gcc -I. -c -O2 mrgcd.c
gcc -I. -c -O2 mrjack.c
gcc -I. -c -O2 mrbits.c
gcc -I. -c -O2 mrxgcd.c
gcc -I. -c -O2 mrarth3.c
gcc -I. -c -O2 mrrand.c
gcc -I. -c -O2 mrprime.c
gcc -I. -c -O2 mrcrt.c
gcc -I. -c -O2 mrscrt.c
gcc -I. -c -O2 mrmonty.c
gcc -I. -c -O2 mrpower.c
gcc -I. -c -O2 mrsroot.c
gcc -I. -c -O2 mrcurve.c
gcc -I. -c -O2 mrfast.c
gcc -I. -c -O2 mrshs.c
gcc -I. -c -O2 mrshs256.c
gcc -I. -c -O2 mrshs512.c
gcc -I. -c -O2 mraes.c
gcc -I. -c -O2 mrgcm.c
gcc -I. -c -O2 mrlucas.c
gcc -I. -c -O2 mrstrong.c
gcc -I. -c -O2 mrbrick.c
gcc -I. -c -O2 mrebrick.c
gcc -I. -c -O2 mrgf2m.c
gcc -I. -c -O2 mrec2m.c
gcc -I. -c -O2 mrzzn2.c
gcc -I. -c -O2 mrzzn2b.c
gcc -I. -c -O2 mrzzn3.c
gcc -I. -c -O2 mrecn2.c
ar -rc miracl.a mrcore.o mrarth0.o mrarth1.o mrarth2.o mralloc.o mrsmall.o
ar -r  miracl.a mrio1.o mrio2.o mrjack.o mrgcd.o mrxgcd.o mrarth3.o mrgcm.o
ar -r  miracl.a mrrand.o mrprime.o mrcrt.o mrscrt.o mrmonty.o mrcurve.o 
ar -r  miracl.a mrfast.o mrshs.o mraes.o mrlucas.o mrstrong.o mrbrick.o 
ar -r  miracl.a mrebrick.o mrec2m.o mrgf2m.o mrpower.o mrsroot.o mrzzn2b.o
ar -r  miracl.a mrshs256.o mrshs512.o mrbits.o mrzzn2.o mrzzn3.o mrecn2.o
del mr*.o
gcc -I. -c pk-demo.c
ld pk-demo.o miracl.a -o pk-demo.axf
至于Android上GCC的配置以及各种文件挪来挪去以及格式转换什么的 ,虽然很麻烦,但是没有技术含量,略去。

执行最后ld的时候出现了成堆的link error,看了一下貌似也是extern “C"的问题...

以上,完成Android上的编译,拷贝miracl.a到lib目录下,测试,通过。


第一次手动编译开源软件成功!开心!


你可能感兴趣的:(个人项目)