web-dev-qa-db-ja.com

GMPライブラリを使用したc ++プログラム

このウェブサイトの指示に従ってGMPをインストールしました: http://www.cs.nyu.edu/exact/core/gmp/ 次に、ライブラリを使用してサンプルプログラムを探しました:

    #include <iostream>
#include <gmpxx.h>
using namespace std;
int main (void) {
mpz_class a, b, c;
a = 1234;
b = "-5678";
c = a+b;
cout << "sum is " << c << "\n";
cout << "absolute value is " << abs(c) << "\n";
cin >> a;
return 0;
}

しかし、コマンドg ++ test.cpp -o test.exeを使用してこれをコンパイルすると、gmpxx.hと表示されます。そのようなファイルやディレクトリはありません。どうすれば修正できますか?私はこれが初めての人です。そして、私はMinGWを使用しています。

16
Badshah

ここで実際のバージョンを入手してください GNU GMP Library 。/usr/libにインストールされるように構成してください(構成するには--prefix =/usrを渡します)。

ここにドキュメントがあります: GNU GMP Manual

Libを正しく使用していません。 C++関数でmpx値に直接アクセスできるかどうかはわかりませんが、ここでは達成したいことの実際の例を示します。

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

using namespace std;

int main (int argc, char **argv) {

    mpz_t a,b,c;
    mpz_inits(a,b,c,NULL);

    mpz_set_str(a, "1234", 10);
    mpz_set_str(b,"-5678", 10); //Decimal base

    mpz_add(c,a,b);

    cout<<"\nThe exact result is:";
    mpz_out_str(stdout, 10, c); //Stream, numerical base, var
    cout<<endl;

    mpz_abs(c, c);
    cout<<"The absolute value result is:";
    mpz_out_str(stdout, 10, c);
    cout<<endl;

    cin.get();

    return 0;
}

コンパイル:

g++ -lgmp file.cpp -o file
17
someoneigna

gmpライブラリドキュメントには非常に小さな例があるため、参考のためにべき乗の例を含めています:

プログラムは2 ^ 20000を計算します

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

using namespace std;
int main(void) {
  mpz_t result, base;
  mpz_inits(result,base,NULL);
  mpz_set_str(base, "2", 10);
  mpz_pow_ui(result, base, 20000);
  mpz_out_str(stdout, 10, result);
  return 0;
}

コンパイル:g++ -o gmp_pow_test gmp_pow_test.cpp -lgmp

./gmp_pow_testを実行します

次のようにUbuntuにgmpライブラリをインストールします:Sudo apt-get install libgmp-dev libgmpxx4ldbl

7
Piyush Chauhan

現在(7/2/13現在)を設定するための正しい手順を次に示しますGNU Eclipse CDT、MinGW、およびC++用のmsysを使用したbignumライブラリ。これを行うには、以前はUnixやLinux、Windowsを使用していたので、プログラミングとコンパイルプログラムの漠然とした思い出があるはずです。これは、1週間以上の調査とハードコアな欲求不満の集大成です。私の心の力であなたを爆破します!

  1. 私は、すでにEclipseとMinGWをダウンロードしてインストールし、Minsysにmsysをインストールしていると想定しています。 msysの前にMinGWをインストールする必要があります!

  2. GMPライブラリのtarballをgmplib.orgから$ {gmp_download}にダウンロードします。 lzipを使用したことがなく、msysで使用できるかどうかもわからなかったため、gmp-5.1.2.tar.xzをダウンロードしました。

  3. Msysウィンドウ(基本的にはbashシェル)を開きます。 cd $ {gmp_buid}およびtar -Jxvf $ {gmp_download} /gmp-x.x.x.tar.xz

    これらのtarオプションは、Webの他の場所にあるものとは異なります。 -Jxvfはxz(および私はlzip)に適していますが、gzipには-xzvfを使用します。

  4. cd gmp-x.x.xを実行し、。/ config.guessを実行します。出力を書き留めます。次に必要になります。

  5. ./configure --prefix = $ {gmp_build} --build = --enable-cxx --with-gnu-ldを実行します

    明らかに、GMPにプラットフォーム用にビルドするように明示的に指示しないと、GMPはすべてをビルドしますが、これは悪いことです。 cxxオプションはC++ライブラリをビルドし、-with-gnu-ldを使用すると、ldで動作します。かなり簡単です。

  6. make

  7. インストールする

    EX:C:/ gmpにインストールしたとします。 gmp/include/gmp.hとgmpxx.hが必要です。また、gmp/lib/libgmp.a、libgmp.la、libgmpxx.a、libgmpxx.laも必要です。そこにものを含む共有ディレクトリも必要です。

  8. Eclipseをセットアップします。

    • プロジェクトに移動->プロパティ
    • C/C++ビルド->環境でPATH変数を編集し、$ {gmp_build}/include; $ {gmp_build}/libを追加します
    • C/C++ビルド->設定->ツール設定-> GCCアセンブラ->一般で、$ {gmp_build}/includeをインクルードパスとして追加します。
    • 同じ場所ですが、-> GCC C++コンパイラ->インクルードが$ {gmp_build}/includeをインクルードパスとして追加します。
    • 同じ場所-> GCC C++コンパイラ->その他-末尾に-lgmp -lgmpxxを追加します。行の終わり!
    • 同じ場所-> GCC Cコンパイラ以前と同じインクルードパスとその他のオプションを追加します。
    • 同じ場所-> MinGW C++リンカー->ライブラリ「ライブラリ(-l)」にgmpとgmpxxの両方を追加します。 $ {gmp_build}/libを「ライブラリ検索パス(-L)」に追加します
    • C/C++ General-> Paths&Symbols-> Incudes Tabで、アセンブリ、C、およびC++のインクルードディレクトリに$ {gmp_build}/includeがあることを確認します。それらがそこにない場合、あなたは以前のステップを台無しにしたかもしれません。それらはEclipseによって自動入力されます。
    • 同じ場所-> Librariesタブで、gmpとgmpxxが同じ順序になっていることを確認します。すでに入力されているはずです。
    • 同じ場所-> [ライブラリパス]タブ$ {gmp_build}/libがすでに存在しているはずです。 [適用]をクリックして、インデックスを再構築しないと変更が反映されないことを確認してください。 OKを押して終了します。
  9. この短いプログラムを実行して、設定を確認します。

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <gmp.h>
    #include <gmpxx.h>
    
    using namespace std;
    
    int main ()
    {
        mpz_t p;
        mpz_init_set_ui (p,3);
    
        return 0;
    }
    

    コンパイルコマンドは次のようになります。

     g++ "-IC:\gmp\include" -O0 -g3 -Wall -c -fmessage-length=0 -lgmp -lgmpxx -o main.o "..\main.cpp" g++ "-LC:\gmp\lib" -o GMPDebug.exe main.o -lgmp -lgmpxx
    

ノート:

  1. オプションの順序は重要です。すべての理由はわかりませんが、2番目のコマンドライン(プログラムをリンクする)の-oオプションの前に-lgmp -lgmpxxフラグがあると、リンクが失敗します。

  2. -lフラグは注意が必要です。実際には、「liblibrary.aの-Lを調べてください」と書かれています。この場合、「C:\ gmp\libでlibgmp.aとlibgmpxx.aを探してください」。

  3. Coutと64ビットバージョンのEclipseに関連するバグを聞いたので、同じバグが見られる32ビットバージョンを使用しています。 :-)

7
cassius

使用するライブラリwhatライブラリをコンパイラに通知する必要があります。

g++ -lgmp -lgmpxx file.cpp -o file
4
PLampkin

役に立つには遅すぎるかもしれませんが...

まず、プログラムは問題なく動作します。他の人が指摘したように、(a)GMPライブラリがインストールされていることを確認する必要があります(そのgmpxx拡張子とすべての関連ファイルを含む)。(b)両方のインクルードファイルの場所をコンパイラに通知している。リンクするライブラリ。私の場合、インクルードファイルは/ opt/local/includeにあり、ライブラリは/ opt/local/lib(Macportsがそれらを配置した場所)にあります。

これがコードです:

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

using namespace std;

int main (void) {
    mpz_class a, b, c;

    a = 1234;
    b = "-5678";
    c = a+b;

    cout << "sum of " << a << " and " << b << " is " << c << "\n";
    cout << "absolute value is " << abs(c) << "\n";
    // cin >> a;
    return 0;
}

コンパイル/リンクコマンドは次のとおりです。

clang++ -o gmpxx-tst -I/opt/local/include gmpxx-tst.cpp -L/opt/local/lib -lgmpxx -lgmp

Gmpxx-tstを呼び出すと次のようになります。

$ ./gmpxx-tst
sum of 1234 and -5678 is -4444
absolute value is 4444 
$
3
Mouse

コンパイラにwhereヘッダーファイルがあることを伝える必要があります。

g++ test.cpp -I/path/to/directory/that/contains/the/header -o test.exe
3
chrisaycock