【问题标题】:How to build mpir-2.4.0 with Visual Studio 2010?如何使用 Visual Studio 2010 构建 mpir-2.4.0?
【发布时间】:2011-08-07 03:33:29
【问题描述】:

我遵循了 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 控制台应用程序项目,并在 Project Properties\Linker\Command Line\ 下添加两个 Additional Options。他们是:

  • 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 位会导致这个问题。任何的想法?谢谢。

【问题讨论】:

    标签: c++ visual-studio installation compiler-errors


    【解决方案1】:

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

    【讨论】:

    • 感谢您指出这一点。实际上,我更改为发布模式,但仍然出现链接器错误。我什至切换回 Rick Regan 的版本,它仍然会产生同样的错误。例如,在我的 Visual Studio 2008 上,我得到了error LNK2001: unresolved external symbol___gmpz_set_si。顺便说一句,我编辑了错误输出。
    • 好吧,我会发布确切的错误消息,那里可能有一些线索。我也会回到起点,重新开始。尽量不要复制文件,更改您的项目,以便从构建它们的位置获取库和头文件。你需要的一切都在 lib/Win32/Release 中。最后,它对我有用,您的环境和我的环境之间的唯一区别是我使用的是 VC++ 2010 Express。所以它可以工作,可能你在某个地方犯了一些错误。
    • 为什么要下载两个版本的yasm?你为什么要重命名其中之一?我下载了 Visual Studio (tortall.net/projects/yasm/releases/vsyasm-1.1.0-win64.zip) 的 64 位版本,并没有重命名任何东西。
    • 您的描述中可能还不清楚另一件事。您不需要构建所有库,只需构建 C++ 一个 lib_mpir_cxx 和一个 C 库,我最初会选择 lib_mpir_gc,因为它不依赖于汇编程序。以 lib/Win32/Release 结尾的库只是您构建的最新版本。
    • 非常感谢您的努力。我想知道您是否使用 VC 2008 将其中任何一个(vsyasm.props、vsyasm.targets、vsyasm.xml)复制到您的 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCProjectDefaults`? By the way, I also built only the lib_mpir_p4` 和 lib_mpir_cxx,但它仍然不适用于 C++.
    【解决方案2】:

    我猜你构建了 x64 库?我做到了,然后遇到了与您遇到的问题类似的问题。确保正确配置您的 MSVC 项目以使用 x64 库...此链接应该会有所帮助:How to compile a 64-bit application using Visual C++ 2010 Express?

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2011-08-17
    • 2012-05-27
    • 2011-05-12
    • 2011-04-08
    • 2023-03-22
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多