2013-01-02 6 views
11

Я установил GMP с помощью инструкции на этом сайте: http://www.cs.nyu.edu/exact/core/gmp/ Тогда я искал пример программы с использованием библиотеки:C++ с использованием 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; 
} 

Но если я компилирую это с помощью команды: г ++ тест .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 значения с функциями 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; 
} 

Compile с:

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

Ваш код использует API C, а не C++ API. Ссылка на библиотеки, которые вы предоставляете, устарела (старые версии GMP). – 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 говорит, где найти #includes, -L говорит, где найти аргументы -l (и я надеюсь, что вам не нужен -R). человек ld. –

1

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

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

Вот правильная процедура настройки тока (по состоянию на 7/2/13) библиотеки ГНУ 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.tar.xz, потому что я никогда не использовал lzip и не знал, был ли он доступен в msys.

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

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

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

  5. Run ./configure --prefix = $ {gmp_build} --build = --enable-CXX --with-гну-л.д.

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

  6. сделать

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

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

  8. Настройка затмение:

    • Перейти к проекту -> Свойства
    • Под C/C++ Build -> Environment редактировать переменную PATH и добавить $ {gmp_build}/включают в себя: $ {gmp_build }/lib
    • В разделе C/C++ build -> settings -> settings -> GCC Assembler -> general add $ {gmp_build}/include как путь включения.
    • То же место, но -> Компилятор GCC C++ -> Включает add $ {gmp_build}/include как путь включения.
    • То же место -> Компилятор GCC C++ -> Разное add -lgmp -lgmpxx до END строки. КОНЕЦ ЛИНИИ!
    • То же самое место -> Компилятор GCC C Добавьте те же включенные пути и разные параметры, что и раньше.
    • То же самое место -> MinGW C++ linker -> Библиотеки Добавить в «Библиотеки (-l)» и gmp и gmpxx В ЭТОМ ЗАКАЗЕ! Теперь добавьте $ {gmp_build}/lib в "LIbrary Search Path (-L)"
    • Под C/C++ Общие -> Пути & Символы -> Вкладка Incudes проверяет, что у вас есть $ {gmp_build}/include в вашем include каталоги для сборки, C и C++. Если их нет, вы, возможно, испортили более ранний шаг. Они должны быть автоматически заполнены Eclipse.
    • В том же месте -> вкладка «Библиотеки» проверьте, что у вас есть gmp и gmpxx В ЭТОМ ЗАКАЗЕ. Он уже должен быть заселен.
    • То же место -> вкладка «Пути к библиотеке» Проверить наличие $ {gmp_build}/lib, которое должно быть уже там. Нажмите «Применить» и убедитесь, что вы перестроили индекс или изменений не потребуется. Нажмите ОК, чтобы закрыть.
  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.a». В этом случае «Go посмотрите в C: \ gmp \ lib для libgmp.a и libgmpxx.a».

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

+0

Отличный всплеск. Спасибо за ваше время – smac89

0

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

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

Поскольку существует очень небольшие примеры в документах библиотеки 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

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

+2

Если вы собираетесь писать C-код, вы можете включить только gmp.h и скомпилировать с компилятором C, вам не нужно связываться с gmpxx. Кроме того, mpz_pow_ui не выглядит как эффективный способ вычислить мощность 2. –

+0

информация принята, спасибо :) –

Смежные вопросы