一、环境
- IDE:Visual Stdio 2017(更高版本应该也是类似的)
- miracl版本:5.5.4
- 官网下载地址:https://github.com/miracl/MIRACL
- 百度云下载地址: https://pan.baidu.com/s/1pYEeIQfjOLM7xSnsmBaQMQ 提取码: i2hn
如果你只是想要编译结果,而不想自己编译,下面为备用百度云盘下载链接。笔者提供了VS 2017 和 VC 6.0两种版本的:
二、编译miracl
- 首先下载并且解压miracl压缩包,如下图:
- 新建一个文件夹miracl,并将刚才解压的压缩包中的所有单文件(包括文件夹中的文件)拷贝到miracl目录中
- 打开Visual stadio 2017,文件–新建–项目–Visual C++–空项目
- 将miracl文件夹中的所有文件拷贝到CompileMiracl的工程目录,和工程源文件放在一个文件夹
- 项目上右键–添加–现有项
- 添加头文件和源文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51miracl.h
mirdef.h
mraes.c
mralloc.c
mrarth0.c
mrarth1.c
mrarth2.c
mrarth3.c
mrbits.c
mrbrick.c
mrbuild.c
mrcore.c
mrcrt.c
mrcurve.c
mrdouble.c
mrebrick.c
mrec2m.c
mrgf2m.c
mrfast.c
mrflash.c
mrflsh1.c
mrflsh2.c
mrflsh3.c
mrflsh4.c
mrfrnd.c
mrgcd.c
mrgcm.c
mrio1.c
mrio2.c
mrjack.c
mrlucas.c
mrmonty.c
mrmuldv.c
mrpi.c
mrpower.c
mrprime.c
mrrand.c
mrround.c
mrscrt.c
mrshs.c
mrshs256.c
mrshs512.c
mrsmall.c
mrsroot.c
mrstrong.c
mrxgcd.c
mrzzn2.c
mrzzn2b.c
mrzzn3.c
mrecn2.c - 项目上右键–属性
- 更改下图所示内容
- 项目上右键–生成/重新生成
- 编译完成
三、使用mircacl库编程
- 打开VS 2017,文件–新建–项目–Visual C++–空项目,项目名为test
- 进入之前新建的CompileMiracl项目的debug以及源代码文件夹,拷贝 “mircal.h”、”mirdef.h”、”CompileMiracl.lib”、”CompileMiracl.pdb”到test项目的源代码路径
- 重命名 “CompileMiracl.lib” 为 “miracl.lib” ,”CompileMiracl.pdb” 为 “miracl.pdb”
- test项目上右键–添加–现有项,进入当前工程的源文件目录,添加”mircal.h”、”mirdef.h”、”miracl.lib”、”miracl.pdb”四个文件
- test项目上右键–添加–新建项–C++文件,文件名为”main.c”,写入如下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include<stdlib.h>
#include "miracl.h"
int main()
{
miracl *mip = mirsys(500, 16); //初始化miracl系统
big n = mirvar(8); //初始化n,必须有
cotnum(n, stdout); //打印n
cinnum(n, stdin); //输入n
cotnum(n, stdout); //再次打印n
system("pause");
return 0;
} - 点击运行按钮(本地windows调试器)即可
四、一些补充
原来这篇文章我是发在CSDN的,后来不满CSDN的操作,博客整体迁移到简书平台。几年中陆陆续续有人提出了自己遇到的一些问题,这里我根据已有的提问,给出一些补充内容:
- 如果你编译这个库是用于C语言,后续代码(比如这里的main.c文件),请务必使用”.c”结尾,而不是”.cpp”,否则可能会引发链接错误!!
下面的解释,感兴趣读者的可以看看:很多人可能学C语言的时候并不会刻意以”.c”作为源文件结尾,且大多数IDE默认后缀就是”.cpp”,直接用来写C语言也能执行。然而,实际上”cpp”是“c plus plus(C++)”的缩写。顾名思义,”.cpp”文件通常被认为是一个C++代码文件,而不是C的。至于为什么用”.cpp”也能正常编译,因为C++本身是C语言的超集(可以认为是面向对象的扩充)。看到这里,其实你们已经明白了,一个后缀的差距,背后是完全不同的两套编译规则!!
举个简单的例子:很多人可能初学C语言,用过Visual C++ 6.0(后面简称VC6.0)这个IDE,它诞生自1998年,故支持的C语言标准最高为C98,故C99标准新加入的“随用随定义”特性它并不支持。所以你如果在VC 6.0中,代码中间某个位置定义一个变量,它会报错…..但是如果你把文件后缀由”.c”改为”.cpp”,它是不会报错的,因为C++早期版本就已经支持随用随定义了,是作为C++语法的一部分!。由此可以证明,两种不同的文件后缀,对应的是完全不同的编译规则!
那么为什么在这个代码中,用”.cpp”作为后缀不可以呢,下面给出我的看法(我写这个博客很多年了,手上也没有源码,我说一下我的猜测),程序编译时是可以检测到当前执行的是C++还是C的(其实就是检测一个特定的宏是否存在,感兴趣的自己查一下)。结合条件编译,可以在以C语言方式编译代码时,屏蔽头文件中属于C++语法的那部分,使得代码不报错。但如果你把后缀写成”.cpp”,编译器就会以C++方式编译。Miracl库的文件恰好是同时包含C++和C语言两套库的,错误的编译方式自然会导致条件编译进入了不期望的状态,所以会导致链接错误!