如何在Visual Studio 2010中构建mpir-2.4.0?

3
我按照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。
具体来说:
  • 首先,我从http://www.mpir.org/下载了MPIR版本2.4.0的源代码,即Source tarball bz2
  • 接下来,我从http://yasm.tortall.net/Download.html下载了yasm。我下载了Win64.exeWin64 VS2010.zip,并将它们都放在我的VC\bin目录中。我还将yasm-1.1.0-win64.exe重命名为yasm.exe
  • 然后,我打开build.vc10文件夹中的mpir.sln,并在release模式下构建了所有lib项目,因为我只想使用静态库。
构建这些解决方案后,它会生成一个名为Win32的文件夹,在此文件夹中有另一个名为Release的文件夹,其中有四个其他库文件:
  • mpir.lib
  • mpirrxx.lib
  • mpir.pdb
  • mpirxx.pdb
此外,在build.vc10文件夹中的lib文件夹还生成了另外两个文件夹:
  • Win32
  • x64
接下来,我将所有库文件从 build.vc10\lib 复制到了 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include,同时将 mpir.hmpirxx.h 复制到了 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
完成以上步骤后,我创建了一个Win32控制台应用程序项目,并在项目属性\链接器\命令行\下添加了两个附加选项。它们是:
  • mpir.lib
  • mpirxx.lib

然后,我用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位是否会导致此问题。有什么想法吗?谢谢。

2个回答

1

虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅仅依赖链接的答案可能会因为链接页面的变动而失效。 - mbinette

1

尽管您已经构建了MPIR的发布版本,但您正在使用自己项目的调试版本。请构建MPIR的调试版本或切换到您的项目的发布版本。


谢谢您指出这一点。事实上,我已经改为发布模式,但仍然遇到了链接器错误。我甚至切换回Rick Regan的版本,它仍然会产生相同的错误。例如,在我的Visual Studio 2008中,我得到了error LNK2001: unresolved external symbol___gmpz_set_si。顺便说一下,我编辑了错误输出。 - roxrook
你为什么下载了两个版本的yasm?而且你为什么重命名其中一个?我下载了Visual Studio的64位版本(http://www.tortall.net/projects/yasm/releases/vsyasm-1.1.0-win64.zip),并没有重命名任何东西。 - john
非常感谢您的努力。我想知道您是否将这些文件(vsyasm.props、vsyasm.targets、vsyasm.xml)复制到了C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCProjectDefaults\?顺便说一下,我也只使用VC 2008构建了lib_mpir_p4lib_mpir_cxx,但仍然无法在**C++**中工作。 - roxrook
我这样做了,但因为这些文件也在MPIR项目目录中,所以我认为这是不必要的。关于你的情况,奇怪的是C的示例可以工作,但C++的示例不行。而且在C++示例中,错误是关于C库的未解析项。你是否可能混合使用了32位和64位库?也就是说,你的C库是32位的,而你的C++库是64位的,或者反过来? - john
再次感谢。我不知道为什么,但我重新开始并且它正常工作了。按照您的指示,我只构建了lib_mpir_gclip_mpir_cxx。此外,我使用的文件来自lib文件夹而不是Win32文件夹。奇怪的是,我使用的是与Rick在VS2008上使用MPIR-1.3完全相同的过程,并且我得到了类似的错误消息。因此,我猜这取决于我的机器架构,当阅读readme.txt时,为了安全起见,只需构建我上面提到的两个。 - roxrook
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接