Windows上的gmp库 - 链接错误LNK2001未解析的外部符号运算符<<

时间:2013-09-08 15:49:29

标签: c++

我使用mingw和msys从源代码安装了gmp库(版本5.1.2)。

此示例程序取自维基百科:

#include <iostream>
#include <gmp.h>
#include <gmpxx.h>

int main()
{
    mpz_class x("7612058254738945");
    mpz_class y("9263591128439081");    

    std::cout << "\n    " << x << "\n*\n    " << y;
    std::cout << "\n--------------------\n" << x * y << "\n\n";

    return 0;
}

如果我用mingw编译:

g++ -Wall -pedantic -O3 -I/c/Libs/GMP/include -L/c/Libs/GMP/lib hello_gmp.cpp -o hellocpp_gmp -lgmpxx -lgmp

它编译并运行。

如果我使用visual studio 2010/2012编译,则会出现以下错误:

error LNK2001: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct __mpz_struct const *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PBU__mpz_struct@@@Z)

如果我修改这样的代码:

#include <iostream>
#include <gmp.h>
#include <gmpxx.h>

int main()
{
    mpz_class x("7612058254738945");
    mpz_class y("9263591128439081");
    mpz_class z("0");

    //std::cout << "\n    " << x << "\n*\n    " << y;
    //std::cout << "\n--------------------\n" << x * y << "\n\n";

    z = x * y;
    std::cout << "\n    " << x.get_str() << "\n*\n    " << y.get_str();
    std::cout << "\n--------------------\n" << z.get_str() << "\n\n";
    return 0;
}

它编译并运行。

在文件“gmpxx.h”中&lt;&lt;运算符定义如下:

第2054行关于:

/ **************** I / O operators **************** /

// These Should (and will) be provided separately

template <class T, class U>
inline std :: ostream & operator <<
(std :: ostream & o, const __ gmp_expr U> & T, expr)
{
    __gmp_expr <T, T> const & temp (expr);
    return o << temp.__get_mp();
}

template <class T>
inline std :: istream & operator >> (std :: istream & i, __ gmp_expr <t & T, expr)
{
    return i >> expr.__get_mp ();
}

第2880行:

#define __GMP_DEFINE_BINARY_FUNCTION_UI(fun, eval_fun)                 \
                                                                   \
template <class T, class U>                                            \
inline __gmp_expr                                                      \
<T, __gmp_binary_expr<__gmp_expr<T, U>, mp_bitcnt_t, eval_fun> > \
fun(const __gmp_expr<T, U> &expr, mp_bitcnt_t l)                 \
{                                                                      \
    return __gmp_expr<T, __gmp_binary_expr                               \
    <__gmp_expr<T, U>, mp_bitcnt_t, eval_fun> >(expr, l);        \
}

第3080行:

__GMP_DEFINE_BINARY_FUNCTION_UI(operator<<, __gmp_binary_lshift)

非常感谢。

1 个答案:

答案 0 :(得分:0)

与VS2012链接时,您错过了gmpxx库。您可能记得在VS库列表中包含gmp库。把gmpxx放在那里,你会没事的。