2013-01-02 16 views
11

का उपयोग कर मैं इस वेबसाइट पर अनुदेश का उपयोग कर जीएमपी स्थापित किया है: http://www.cs.nyu.edu/exact/core/gmp/ तो मैं एक उदाहरण के कार्यक्रम के लिए देखा लाइब्रेरी का उपयोग:C++ प्रोग्राम जीएमपी पुस्तकालय

#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; 
} 

लेकिन अगर मैं इस आदेश का उपयोग कर संकलन: जी ++ परीक्षण .cpp -o test.exe, यह gmpxx.h कहता है: ऐसी कोई फ़ाइल या निर्देशिका नहीं। मैं इसे कैसे ठीक कर सकता हूं? मैं इस तरह का नया हूं। और मैं MinGW का उपयोग कर रहा हूँ।

+0

मुझे पता है कि मुझे देर हो चुकी है, लेकिन मुझे लगता है कि सबसे आसान समाधान https://gmplib.org/manual/C_002b_002b-Interface-General.html पर एक नज़र डालना होगा और संकलन-आदेश पर एक नज़र डालें ... –

उत्तर

12

वास्तविक संस्करण यहां GNU GMP Library प्राप्त करें। सुनिश्चित करें कि आप इसे/usr/lib (pass --prefix =/usr कॉन्फ़िगर करने के लिए) में स्थापित करने के लिए कॉन्फ़िगर करें।

यहां आपके पास दस्तावेज़ हैं: GNU GMP Manual

आप lib का सही उपयोग नहीं कर रहे हैं। अगर आप सीधे 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 
+3

आपका कोड सी एपीआई का उपयोग करता है और सी ++ एपीआई नहीं। आपके द्वारा प्रदान की जाने वाली पुस्तकालयों का लिंक पुराना है (जीएमपी के पुराने संस्करण)। – chmike

2

आपको कंपाइलर कहने की आवश्यकता होगी जहां हेडर फ़ाइल है।

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

यह अभी भी काम नहीं करता है। क्या मुझे कुछ और करना चाहिए था? – Badshah

+0

@llonesmiz अब यह कहता है '' नहीं मिल सकता -lgmpxx '' और "-lgmp नहीं मिल सकता"। यह क्यों है और मैं इसे कैसे ठीक कर सकता हूं? – Badshah

+0

-I कहता है कि # शामिल कहां मिलें, -एल कहता है कि -एल तर्क कहां मिलेंगे (और मुझे उम्मीद है कि आपको आवश्यकता नहीं है -आर)। आदमी एलडी –

1

आप की जरूरत है कंपाइलर को पुस्तकालयों को बताने के लिए जो आप उपयोग करना चाहते हैं।

g++ -lgmp -lgmpxx file.cpp -o file 
6

यहाँ तक वर्तमान ग्रहण CDT, MinGW, और msys सी के लिए ++ के साथ जीएनयू bignum पुस्तकालयों की स्थापना (7/2/13) के रूप में के लिए सही प्रक्रिया है। इसके माध्यम से, आपको यूनिक्स या लिनक्स के साथ-साथ विंडोज़ का उपयोग करना चाहिए था, और आपको प्रोग्रामिंग और संकलन कार्यक्रमों की अस्पष्ट याद रखना चाहिए था। यह एक हफ्ते के शोध और कट्टर निराशा की समाप्ति है, इसलिए यदि मैंने कुछ गड़बड़ कर इसे विनम्रतापूर्वक नोट किया है या मैं आपको अपने दिमाग की शक्ति से उड़ा दूंगा!

  1. मैं आप पहले से ही डाउनलोड किया है और ग्रहण और MinGW स्थापित किया है और MinGW में msys स्थापित किया है है मान लेते हैं। आपको msys से पहले MinGW इंस्टॉल करना होगा!

  2. जीएमपी पुस्तकालयों के लिए gmplib.org से $ {gmp_download} तक टैरबॉल डाउनलोड करें। मैंने gmp-5.1.2.tar.xz डाउनलोड किया क्योंकि मैंने कभी भी lzip का उपयोग नहीं किया है और यह नहीं पता था कि यह msys में उपलब्ध था या नहीं।

  3. एक msys विंडो खोलें (अनिवार्य रूप से एक बैश खोल)। सीडी $ {gmp_buid} और tar-jxvf $ {gmp_download} /gmp-x.x.x.tar.xz

    उन टैर विकल्पों को वेब पर कहीं और मिल सकता है उससे अलग हैं! -जेक्सवीएफ xz के लिए सही है (और मुझे लगता है कि lzip), लेकिन gzip के लिए आप -xzvf का उपयोग करते हैं।

  4. सीडी gmp-x.x.x और रन ./config.guess। आउटपुट लिखें। आपको इसके बाद इसकी आवश्यकता होगी।

  5. भागो कॉन्फ़िगर उपसर्ग = $ {gmp_build} --build = --enable-CXX --with-gnu-ld

    जाहिर है अगर आप स्पष्ट रूप से जीएमपी नहीं बताया के लिए निर्माण करने के लिए अपने मंच यह सब कुछ बनाता है, जो बुरा है।सीओक्स विकल्प सी ++ पुस्तकालय बनाता है और --with-gnu-ld इसे ld के साथ काम करने की अनुमति देता है। बहुत सीधा। मान लीजिए कि आप सी करने के लिए स्थापित:/जीएमपी

  6. बनाने स्थापित

    पूर्व बनाते हैं। आपके पास gmp/include/gmp.h और gmpxx.h होना चाहिए। आपको gmp/lib/libgmp.a, libgmp.la, libgmpxx.a, libgmpxx.la भी होना चाहिए। इसमें सामान के साथ एक साझा निर्देशिका भी होनी चाहिए।

  7. सेट अप ग्रहण:

    • जाओ परियोजना के लिए -> गुण
    • तहत C/C++ का निर्माण -> पर्यावरण पथ चर को संपादित करने और $ {gmp_build}/जोड़ने में शामिल हैं, $ {gmp_build }/lib
    • सी/सी ++ बिल्ड के तहत -> सेटिंग्स -> टूल सेटिंग्स -> जीसीसी असेंबलर -> सामान्य $ {gmp_build} जोड़ें/पथ शामिल करें।
    • वही जगह लेकिन -> जीसीसी सी ++ कंपाइलर -> $ {gmp_build} जोड़ें/शामिल पथ के रूप में शामिल करें।
    • वही स्थान -> जीसीसी सी ++ कंपाइलर -> लाइन के अंत में विविध add -lgmp -lgmpxx। रेखा के अंत!
    • वही स्थान -> जीसीसी सी कंपाइलर इसमें पहले के रूप में पथ और विविध विकल्प शामिल हैं।
    • वही स्थान -> मिनजीडब्ल्यू सी ++ लिंकर -> पुस्तकालय "पुस्तकालय (-एल)" दोनों में gmp और gmpxx दोनों में जोड़ें! अब "लिब्ररी सर्च पाथ (-एल)"
    • सी/सी ++ सामान्य के तहत $ {gmp_build}/lib जोड़ें -> पथ & प्रतीकों -> टैब को चेक करता है कि आपके पास $ {gmp_build}/शामिल है असेंबली, सी, और सी ++ के लिए निर्देशिका। यदि वे वहां नहीं हैं तो आप पहले के कदम को गड़बड़ कर सकते हैं। वे ग्रहण द्वारा स्वत: आबादी होना चाहिए।
    • वही स्थान -> पुस्तकालय टैब जांचें कि आपके पास ऑर्डर में gmp और gmpxx है। यह पहले से ही आबादी होनी चाहिए।
    • वही स्थान -> लाइब्रेरी पथ टैब $ {gmp_build}/lib के लिए जांचें जो पहले से ही होनी चाहिए। "लागू करें" दबाएं और सुनिश्चित करें कि आप इंडेक्स का पुनर्निर्माण करते हैं या परिवर्तन नहीं करेंगे। बंद करने के लिए ठीक दबाएं।

      #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. भागो इस छोटे से कार्यक्रम अपने सेटअप की जांच करने के लिए

    विकल्पों का क्रम महत्वपूर्ण है। मैं सभी whys नहीं जानता, लेकिन अगर दूसरी कमांड लाइन (जो प्रोग्राम को लिंक करती है) -ogmp -lgmpxx -o विकल्प से पहले झंडे है, तो लिंकिंग खराब तरीके से विफल हो जाएगी।

  2. -एल ध्वज एक मुश्किल है। यह वास्तव में कहता है "liblibrary.a के लिए -एल देखें-"। इस मामले में "libgmp.a और libgmpxx.a के लिए सी: \ gmp \ lib में देखें।"

  3. मैंने कोउट और ग्रहण के 64 बिट संस्करण से जुड़े बगों के बारे में सुना है, इसलिए मैं 32 बिट संस्करण का उपयोग कर रहा हूं, जहां मैं एक ही बग देख रहा हूं।:-)

+0

उत्कृष्ट splaining। आपके समय के लिए धन्यवाद – smac89

0

यह शायद उपयोगी होने के लिए बहुत देर हो चुकी है, लेकिन ...

पहले, अपने कार्यक्रम ठीक काम करता है। जैसा कि अन्य ने इंगित किया है, आपको यह सुनिश्चित करना होगा कि (ए) सुनिश्चित करें कि जीएमपी लाइब्रेरी स्थापित है (इसके जीएमपीओक्स एक्सटेंशन और सभी प्रासंगिक फाइलों सहित), और (बी) कि आप कंपाइलर को कह रहे हैं कि दोनों फाइलें कहां मिलें, और साथ जोड़ने के लिए पुस्तकालयों। मेरे मामले में फ़ाइलें/opt/local/include में शामिल हैं, और पुस्तकालय/opt/local/lib में हैं (जहां मैकपोर्ट्स ने उन्हें रखा है :)।

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

यहाँ gmpxx-tst के आह्वान का उत्पादन है::

#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; 
} 

यहाँ संकलन/लिंक आदेश दिया गया है:

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

के बाद से वहाँ बहुत हैं

कोड यह जीएमपी लाइब्रेरी डॉक्स में छोटे उदाहरण, मैं रेफर के लिए एक्सपोनेंटिएशन उदाहरण समेत हूं nce:

कार्यक्रम की गणना करता है 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 पर जीएमपी पुस्तकालय स्थापित करें: sudo apt-get install libgmp-dev libgmpxx4ldbl

+2

यदि आप सी कोड लिखने जा रहे हैं, तो आप केवल gmp.h को शामिल कर सकते हैं और एक सी कंपाइलर के साथ संकलित कर सकते हैं, आपको gmpxx से लिंक करने की आवश्यकता नहीं है। इसके अलावा, mpz_pow_ui 2. –

+0

की शक्ति की गणना करने के लिए एक प्रभावी तरीका की तरह नहीं दिखता है, धन्यवाद :) –

संबंधित मुद्दे