Pull to refresh

Сборка и подключение библиотеки GMP к проекту Qt под Windows

GMP — это свободная библиотека для производства различных арифметических действий над целыми, рациональными и действительными числами. Разрядность чисел, с которыми работает библиотека ограничивется памятью самой машины. На многих сайтах пишут что GMP самая быстрая.

Ну что же попробуем собрать GMP под Windows. Для этого надо скачать кое какие дистрибутивы,
Сам GMP
MinGW — если есть в Qt Creator — не надо
MSYS
Теперь устанавливаем, начинаем с mingw — ставим в c:\mingw (но это у меня), затем MSYS(во время установки указываем каталог с mingw, но если вы этого не сделали ни беда, в папке etc есть файлик fstab.sample, залазте в него, редактируйте пути и переименовывайте в fstab).
Распаковываем архив с GMP в C:\MinGW\msys\1.0\home\user(C:\MinGW\msys\1.0 — папка с установленным MSYS, home\user — рабочая папка пользователя («user»-имя пользователя)). Кликаем по иконке MSYS на рабочем столе, появляется консоль. Также MinGW и MSYS можно установить через mingw-get-inst (что гораздо проще).

1. mkdir gmp — создаем каталог, сюда будут сбрасываться результаты сборки

2. cd gmp-5.0.5 — переходим в каталог с сырцами GMP

С начала собираем MinGW под Win (результатом будет статическая библиотека libgmp.a)

./configure --prefix=/home/user/gmp — конфигурируем GMP перед сборкой, /home/user/gmp куда записываем результат компиляции.

Далее идет длительная операция конфигурирования ( у меня около 2-ух часов )

Если без ошибок продолжаем дальше.

make — собираем

make check — проверяем (на сайте разработчика это рекомендуют сделать)

make install — устанавливаем в папку GMP

make clean — убираемся

Итак, теперь в /home/user/gmp были созданы папки include (gmp.h), lib(libgmp.a и libgmp.la) и share копируем файлы в соответствующие папки MinGW ( ВАЖНО!!! )

Теперь собирем dll

./configure --prefix=/home/user/gmp --disable-static --enable-shared

make
make check
make install ( ВАЖНО!!!) Ни в коем случае не выполнять make clean
В противном случае придется собирать все заново.

В /home/user/gmp добавилась папка bin (libgmp-10.dll, переименуйте libgmp-10.dll в libgmp-3.dll), в lib добавился libgmp.dll.a

В текущей папке была создана папка .libs, в ней был создан файл libgmp-10.dll.def (переименуйте его в libgmp-3.def), его мы и передадим утилите lib из VC, для сборки из него файла libgmp-3.lib.

ЕСЛИ ВЫ ВЫПОЛНИЛИ MAKE CLEAN, ТО ПАПКА .libs БУДЕТ УДАЛЕНА, СООТВЕТСТВЕННО НЕ БУДЕТ И libgmp-10.dll.def!

Идем ( если установлена VS ) C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\, переносим файлы LIB.EXE И LINK.EXE в .libs Если возникает ошибка, что система не может найти файл mspdb80.dll, то находим и переносим его в system32.
Далее запускаем link.exe и
cd .libs

lib /machine:x86 /def:libgmp-3.def
Библиотека собрана.

Теперь про подключение полученной библиотеки к Qt Creator.
1. Создаем новый проект.
2. В левом верхнем углу находиться вкладка Проекты. Выделяем необходимый нам проект.
Правой кнопкой мыши по названию-> Добавить библиотеку.
3. Выбираем внешнюю библиотеку.
4. Переносим файлы libgmp-3.lib, gmp.h и libgmp-3.def в папку нашего проекта ( не обязательно, можно указать весь путь, а можно и так ).
5. Файл Библиотеки -> Обзор-> Выбираем libgmp-3.lib.
В файле имя_проекта.pro появляется такие строки

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/ -llibgmp-3
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ -llibgmp-3d    // - стираем букву d после 3
else:symbian: LIBS += -llibgmp-3
else:unix: LIBS += -L$$PWD/ -llibgmp-3
 
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/
 
win32:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/libgmp-3.lib
else:win32:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/libgmp-3d.lib // - стираем букву d после 3
else:unix:!symbian: PRE_TARGETDEPS += $$PWD/liblibgmp-3.a


Стираем букву d после имени библиотеки.

Далее в файле main.cpp пишем


#include "gmp.h" 
 #include <QtCore/QCoreApplication>
#include <conio.h>
#include <stdio.h>
#include "gmp.h"
 
 
 
int main ( int argc, char *argv[] )
{
 
   QCoreApplication a(argc, argv);
   mpz_t x;
   mpz_init_set_si(x, 1);
 
   for ( int i = 0; i < 100; i ++ )
      mpz_add ( x, x, x );
 
   mpz_out_str ( stdout, 10, x );
 
 
   getch();
 
   return a.exec();
}


Это пример.
Вывод приложения: 1267650600228229401496703205376
Плюс для запуска не из компилятора нужно скопировать библиотеку в папку, где exe'шник
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.