Подтвердить что ты не робот

С++ программа с использованием библиотеки 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.cpp -o test.exe, он говорит gmpxx.h: нет такого файла или каталога. Как я могу это исправить? Я как бы новичок в этом. И я использую MinGW.

4b9b3361

Ответ 1

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

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

Вы не используете 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

Ответ 2

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

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

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

  • Откройте окно msys (в основном оболочку bash). cd ${gmp_buid} и tar -Jxvf ${gmp_download}/gmp-x.x.x.tar.xz

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

  • cd gmp-x.x.x и запустите. /config.guess. Запишите выход. Он вам понадобится.

  • Запустить./configure --prefix = ${gmp_build} --build = --enable-cxx --with-gnu-ld

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

  • сделать

  • сделать установку

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

  • Настройка затмения:

    • Перейти к проекту → свойства
    • В C/С++ build → Environment отредактируйте переменную PATH и добавьте ${gmp_build}/include; ${gmp_build}/lib
    • В настройках C/С++ build → - > tool → GCC Assembler → general add ${gmp_build}/include в качестве пути включения.
    • То же место, но → Компилятор GCC С++ → Включает add ${gmp_build}/include как путь включения.
    • В том же месте → Компилятор GCC С++ → Добавить add -lgmp -lgmpxx в конец END строки. КОНЕЦ ЛИНИИ!
    • То же место → Компилятор GCC C Добавьте те же самые пути включения и другие параметры, что и раньше.
    • То же место → MinGW С++ linker → Библиотеки Добавить в "Библиотеки (-l)" и gmp и gmpxx В ЭТОМ ЗАКАЗЕ! Теперь добавьте ${gmp_build}/lib в "LIbrary Search Path (-L)"
    • В разделе C/С++ General → Paths and Symbols → Incudes Tab проверьте, что у вас есть ${gmp_build}/include в ваших каталогах include для сборки, C и С++. Если их нет, вы, возможно, испортили более ранний шаг. Они должны быть автоматически заполнены Eclipse.
    • В том же месте → вкладка "Библиотеки" проверьте, что у вас есть 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
    

Примечания:

  • Порядок опций важен. Я не знаю всех из них, но если вторая командная строка (которая связывает программу) имеет флаги -lgmp -lgmpxx перед параметром -o, связь будет терпеть неудачно.

  • Флаг -l является сложным. На самом деле он говорит: "Пойдите в -L для liblibrary.a". В этом случае "Go посмотрите в C:\gmp\lib для libgmp.a и libgmpxx.a".

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

Ответ 3

Поскольку в 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

Запуск: ./gmp_pow_test

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Возможно, слишком поздно быть полезным, но...

Во-первых, ваша программа работает нормально. Как указывалось другими, вам необходимо (а) обеспечить, чтобы библиотека 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 
$