无法弄清楚为什么多精度计算对我来说不适用于使用boost库

时间:2016-09-19 17:33:47

标签: c++ visual-studio boost

首先我尝试使用GMP,因为boost文档说它更快但是boost库中缺少gmp.h文件所以我必须安装GMP库并复制gmp.h.这样做后,我在使用mpz_int时遇到外部符号错误。 所以我决定尝试使用cpp_int,从boost文档复制示例并且它有效。这就是我的尝试:

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>

int main()
{
   using namespace boost::multiprecision;

   int128_t v = 1;

   // Do some fixed precision arithmetic:
   for(unsigned i = 1; i <= 20; ++i)
      v *= i;

   std::cout << v << std::endl; // prints 20!

   // Repeat at arbitrary precision:
   cpp_int u = 1;
   for(unsigned i = 1; i <= 100; ++i)
      u *= i;

   std::cout << u << std::endl; // prints 100!

   return 0;
}

然后我在Math类中创建了一个阶乘函数,但现在每次使用cpp_int库中的变量时,我都会收到该错误: 错误LNK2019:函数“void __cdecl std :: _ Debug_message(wchar_t const *,wchar_t const *,unsigned int)”中引用了未解析的外部符号__CrtDbgReportW“(?_ Debug_message @std @@ YAXPB_W0I @ Z)

现在,每当我尝试为cpp_int变量分配一个新值时,我都会得到该错误,奇怪的是该示例有效,现在相同的示例对此项目不起作用,但如果我创建一个新项目并且使用相同的升级lib它再次起作用。

1 个答案:

答案 0 :(得分:1)

您正在使用的某个库(可能是cpp_int库)可能希望链接到Visual Studio运行时库的 Debug 版本。 (符号__CrtDbgReportW仅在VS运行时库的调试版本中定义。)

确保编译适当目标(调试/发布)的代码,为正在使用的第三方库编译相同的目标,并链接到相应的运行时库。

编辑(在您之前添加的评论之后):

确保为VC运行时库(又名libcpmtd.lib)的静态 调试版本编译代码:

在Visual Studio中,打开“项目属性”对话框,然后在Configuration Properties - &gt;中C/C++ - &gt; Code Generation,字段Runtime Library,设置为:Multi-threaded Debug (/MTd)

请注意,链接到您的版本的任何其他库都必须具有相同的设置。