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」では、<< 演算子は次のように定義されています。
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)
どうもありがとうございました。