我按照Rick Regan http://www.exploringbinary.com/how-to-install-and-run-gmp-on-windows-using-mpir/的指示行事。遗憾的是,由于某些原因,静态库仅适用于C.对于C ++,编译器总是抱怨链接器问题。我使用的当前版本(2.4.0)与Rick Regan版本之间存在一些差异。另一方面,我也跟着build.vc10
文件夹中的readme.txt,但我仍然无法弄清楚它为何被破坏了。我正在运行Windows 7 x64并使用Visual Studio 2010 - Ultimate。
更具体一点:
Source tarball bz2
。yasm
。我同时下载Win64.exe
和Win64 VS2010.zip
,并将它们都放入我的VC\bin
目录中。我还将yasm-1.1.0-win64.exe
重命名为yasm.exe
mpir.sln
文件夹中打开build.vc10
,并在lib
模式下构建所有release
项目,因为我只想使用静态库。 构建这些解决方案后,它会生成一个名为Win32
的文件夹,在此文件夹中还有另一个名为Release
的文件夹,其中还有四个其他库文件:
此外,lib
内的build.vc10
文件夹还会生成另外两个文件夹:
的Win32
64
接下来,我将所有库文件从build.vc10\lib
复制到我的C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
以及mpir.h
和mpirxx.h
复制到我的C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
。
完成所有这些步骤后,我创建了一个Win32控制台应用程序项目,并在Additional Options
下添加了两个Project Properties\Linker\Command Line\
。他们是:
然后我用C构建了一些示例,它按预期工作。但是,当我尝试这个特定的例子时:
#include <iostream>
using namespace std;
#pragma warning(disable: 4800)
#include <mpirxx.h>
#pragma warning(default: 4800)
int main (int argc, char *argv[])
{
mpz_class aBigPO2;
aBigPO2 = 1073741824; //2^30
aBigPO2*=aBigPO2; //2^60
aBigPO2*=aBigPO2; //2^120
aBigPO2*=aBigPO2; //2^240
aBigPO2*=aBigPO2; //2^480
aBigPO2*=aBigPO2; //2^960
aBigPO2*=aBigPO2; //2^1920
cout << aBigPO2 << endl;
}
失败了许多错误:
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_set_si
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_init
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_mul
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_clear
我不知道为什么会这样。我甚至尝试从Win32
文件夹中复制其他替代方案,但它仍然会产生相同的错误。但我不确定这些文件是如何不同的。我正在运行Windows 7 x64,但我不认为我的Visual Studio是x64。我想知道混合32位和64位可能导致这个问题。任何的想法?谢谢。
答案 0 :(得分:1)
虽然您已构建了MPIR的发行版,但您正在自己项目的调试版中使用它。构建MPIR的调试版本或切换到项目的发布版本。
答案 1 :(得分:1)
我猜你是在构建x64库吗?我做了,然后遇到了类似的问题,你遇到了什么。确保正确配置MSVC项目以用于x64库...此链接应该有所帮助:How to compile a 64-bit application using Visual C++ 2010 Express?