программа на c++ с использованием библиотеки GMP

Я установил 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.тест ЦТП-вывода.exe, он говорит gmpxx.ч: нет такого файла или каталога. Как я могу это исправить? Я новичок в этом. И я использую MinGW.

6 ответов


получить фактическую версию здесь GNU GMP Library. Убедитесь, что вы настроили его для установки в /usr/lib (pass --prefix=/usr для настройки).

здесь у вас есть документация:руководство GNU GMP.

вы неправильно используете lib. Я не знаю, можете ли вы напрямую получить доступ к значениям mpx с функциями C++, но здесь у вас есть рабочий пример того, чего вы хотели достичь:

#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

вот правильная процедура настройки текущих (по состоянию на 7/2/13) библиотек GNU bignum с Eclipse CDT, MinGW и msys для C++. Чтобы пройти через это, вы должны использовать Unix или Linux, а также Windows, и вы должны иметь смутное воспоминание о программировании и компиляции программ. Это кульминация более недели исследований и хардкорного разочарования, поэтому, если я что-то испортил, обратите внимание на это вежливо, или Я взорву вас силой моего ум!

  1. Я предполагаю, что вы уже загрузили и установили Eclipse и MinGW и установили msys в MinGW. Вы должны установить MinGW перед msys!

  2. загрузите tarball для библиотек GMP из gmplib.org до ${gmp_download}. Я загрузил gmp-5.1.2.смола.xz, потому что я никогда не использовал lzip и не знал, доступен ли он в msys.

  3. откройте окно msys (по сути, оболочку bash). компакт ${gmp_buid} и tar-Jxvf ${gmp_download}/gmp-x.X. X. деготь.xz

    эти параметры смолы отличаются от того, что вы можете найти в другом месте в интернете! - Jxvf подходит для xz (и я думаю, lzip), но для gzip вы используете-xzvf.

  4. cd gmp-x.X. Икс и беги ./конфигурация.догадка. Запишите результат. Он вам понадобится в следующий раз.

  5. Run ./настроить --префикс=${gmp_build} --строить= опцией --enable-CXX по - --С-гну-ЛД

    по-видимому, если вы не явно скажите GMP построить для вашей платформы он строит все, что плохо. Опция cxx создает библиотеки C++ и --with-gnu-ld позволяет ей работать с ld. Довольно простой.

  6. сделать

  7. установка

    EX: предположим, вы установили C:/gmp - ... Вы должны иметь gmp / include / gmp.h и gmpxx.h. Вы также должны иметь gmp/lib / libgmp.a, libgmp.la, libgmpxx.a, libgmpxx.Ла. У вас также должен быть каталог share с материалом в он.

  8. настройка eclipse:

    • перейти к проекту -- > свойства
    • в разделе C / C++ build -- > Environment отредактируйте переменную PATH и добавьте ${gmp_build} / include;${gmp_build} / lib
    • в разделе C / C++ build --> settings --> Tool settings --> GCC Assembler --> general add ${gmp_build} / include в качестве пути включения.
    • то же место, но -- > компилятор GCC C++ -- > включает add ${gmp_build} / include как include путь.
    • то же место --> компилятор GCC C++ -- > разное добавить-lgmp-lgmpxx в конец строки. КОНЕЦ ОЧЕРЕДИ!
    • то же место --> компилятор GCC C добавляет те же пути включения и другие параметры, что и раньше.
    • то же самое место --> MinGW c++ linker --> библиотеки добавляют в "библиотеки (-l)" как gmp, так и gmpxx в этом порядке! Теперь добавьте ${gmp_build} / lib в " путь поиска библиотеки (- L)"
    • В Разделе C / C++ Общие -- > Пути И Символы -- > Вкладка Incudes убедитесь, что у вас есть ${gmp_build}/include в каталогах include для Assembly, C и c++. Если их там нет, вы, возможно, испортили предыдущий шаг. Они должны быть автоматически заполнены Eclipse.
    • то же место --> вкладка библиотеки проверьте, что у вас есть 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. порядок параметров важен. Я не знаю всех причин, но если вторая командная строка (которая связывает программу) имеет флаги-lgmp-lgmpxx перед опцией-o, связывание не удастся ужасно.

  2. флага-L-хитрому. На самом деле он говорит: "поищите в-L для liblibrary.ля." В этом случае " Go look in C:\gmp\lib для libgmp.a и libgmpxx.ля."

  3. Я слышал об ошибках, связанных с cout и 64-битной версией eclipse, поэтому я использую 32-битную версию, где я вижу ту же ошибку. :-)


поскольку в документах библиотеки 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;
}

Compile:g++ -o gmp_pow_test gmp_pow_test.cpp -lgmp

Run:./gmp_pow_test

установите библиотеку gmp на Ubuntu со следующим:sudo apt-get install libgmp-dev libgmpxx4ldbl


вам нужно сказать компилятору здесь заголовок файла.

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

вам нужно сообщить компилятору что библиотеки вы хотите использовать.

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

Это, вероятно, слишком поздно, чтобы быть полезным, но...

во-первых, ваша программа работает просто отлично. Как указывали другие, вам нужно (a) убедиться, что библиотека GMP установлена (включая ее расширение gmpxx и все соответствующие файлы), и (b) что вы сообщаете компилятору, где найти как включенные файлы, так и библиотеки для связи. В моем случае файлы include находятся в /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 
$