【Miracl密码库】编译库文件miracl.a/miracl.lib
实验环境:MacOS 64位
gcc版本
在官网下载Miracl密码库源码,github上有Miracl的SDK源码。
1、根据linux64描述,将mirdef.h64 mirdef.h mrcore.c等文件全部拷贝一份到一个单独的文件目录下,这个文件目录将用于生成对应的静态库文件。
2、在新建的文件目录下,新建Makefile文件,用于管理所有的文件。(Makefile的应用参考上一篇案例)
从第一个文件mrcore.c 开始测试,Makefil文件如下
用make命令执行Makefile文件,出现如下错误提示
这是由于-m64不能被系统检测,为此,我们先去掉参数-m64。再次编译
出现非常多的错误,首先指出
typedef unsigned mr_dltype mr_large;
按照定义,这本身是没有问题的,mr_dltype本身就是一个声明类型,导致这个错误的原因,肯定是没有声明mr_dltype。所以定义unsigned mr_dltype的别名为mr_large,是不可能的,后面还有很多关于mr_large的错误。现在需要知道mr_dltype在哪里定义?
在mirdef.h有对mr_dltype的定义,虽然miracl.h有对mirdef.h的包含,但是依然没有起作用。
问题应该出在__int64的定义上,__int64为long long for Unix/Linux。
__int64为微软MSVC定义的数据类型,long long为C99定义的数据类型。
写一小段程序测试
在本系统上,long类型和long long类型,都是8字节大小,所能够表示的数据范围为-9223372036854775808~+9223372036854775807
而且,在本系统上,long long类型是可用的。
现在,修改mirdef.h中关于__int64的定义
在MacOS arm64上编译,与数据类型__int64相关,而__int64类型的原本定义是long long类型,在arm64上是支持的。
修改完成之后,再次用make编译,是可以成功编译的。
现在将其他的.c文件全部编译到静态库文件中。
问题又来了,在编译mrmuldv.c的时候,出现了这样的错误提示
原因在于,gcc支持asm,但是不支持_asm,所以将mrmuldv.c对应的定义修改
现在出现新的错误
到这里出现错误,属于汇编部分内容了。先不忙着去学习汇编,再次阅读文档发现,在mrmuldv.any中给出了各种环境的可能文件,例如选择mrmuldv.g64wen j文件,将mrmuldv.g64修改为mrmuldv.c,然后编译,将出现类似下面的错误。
很明显,这是由于系统环境所导致的。如果选择mrmuldv.ccc,然后将mrmuldv.ccc修改为mrmuldv.c,再次编译应该不会出现上述问题了。
编译过程中,可能遇到的问题,可以参考GitHub上的问题解决。
https://github.com/miracl/MIRACL/issues/4
3、测试编译好的静态库
根据linux64的指导,测试ecsgen,同样的,利用Makefile管理项目。
将第二步生成的静态库放在我们的项目中,并添加上面的文件。
在linux64的指导里面,用的是g++编译,gcc和g++是两个不同版本,查看版本,发现两者完全相同。
为什么用gcc编译报错呢?
gcc是GNU开发的针对c的编译器,刚开始只支持编译c代码,随着gcc的发展愈发强大,后面gcc也支持编译c++、Objective-c和java等,在编译时需要通过设定参数指定编译的语言。所以后来,gcc默认编译的是c代码。把参数给用户设置显然没有那么友好,于是就专门针对c++ 开发了g++编译器。所以gcc是一个编译器集合,而g++是针对c++的编译器。因此,想要使用gcc编译c++的代码需要加上参数 -lstdc++ 指令即可。
或者用g++编译,也是OK的。
很不幸,虽然能够正确编译了,但是在测试的时候,还是出现了下面的错误
这必然是由于ecurve函数调用失败导致的,而导致这个错误的原因,就是因为没有添加common.ecs文件,将这个文件包含进项目,再次测试,就能够得到正确结果。
最后,测试项目中包含的文件如下
4、Miracl库是一个非常强大的密码库,在构建这个项目的时候,最重要的是要生成SDK,这个过程就是生成静态库的过程,常常会遇到很多问题。
主要问题就是环境因素,在mrmuldv.any中给出了一系列的可能环境,根据自己的机器环境,选择不同的环境代码,才能够得到自己的静态库。我想这也是为什么没有给出一个固定的SDK的原因吧,毕竟每个人的应用环境是不同的。但是,不得不说,这个SDK的搭建,确实存在很大的挑战。所以,小编用Makefile来管理所有文件,希望读者在应用的时候,能够轻松掌握。
更多内容,欢迎关注公众号了解。