Получение библиотек gmp для

У меня возникла проблема с компиляцией программы с использованием:

Последние установки Msys и MinGW Windows 7 Pro / Intel Core I5 ​​/ 8 ГБ

Библиотеки GMP 5.1.2 - заголовочный файл находится в C:\gmp\include - файлы .a и .la находятся в C:\gmp\lib

Первоначально я разместил это как вопрос Eclipse, но тишина была оглушительной. С тех пор я попытался скомпилировать, используя только gcc в msys, и у меня возникла та же проблема. Я компилирую, используя:

g++ -I /c/gmp/include -O0 -g3 -Wall -c -fmessage-length=0 -o main.o ./main.cpp

который, кажется, завершается успешно. Затем я связываю, используя:

g++ -L /c/gmp/lib -o GMPDebug.exe main.o

результат:

main.o: в функции main': C:\Users\Clay\workspace\GMPDebug\Debug/../main.cpp:22: undefined reference to__gmpz_init_set_str' collect2.exe: ошибка: ld вернул 1 статус выхода

Программа очень-очень проста - достаточно, чтобы библиотеки заработали:

#include <getopt.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <iostream>
#include <gmpxx.h>
#include <gmp.h>

using namespace std;

int main ()
{
    mpz_t p;
    mpz_init_set_str (p,"3",10); 

    return 0;
}

Все включено потому, что я вырезал это из более крупной программы. Есть идеи, как это исправить?

Спасибо!


person cassius    schedule 30.06.2013    source источник


Ответы (1)


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

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

2) Загрузите архив библиотек 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) Запустите ./configure --prefix=${gmp_build} --build=‹config.guess output› --enable-cxx --with-gnu-ld

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

6) делать

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

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

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

  • Перейти к проекту --> свойства
  • В разделе C/C++ build --> Environment отредактируйте переменную PATH и добавьте ${gmp_build}/include;${gmp_build}/lib
  • В сборке C/C++ --> настройки --> настройки инструмента --> ассемблер GCC --> общие добавьте ${gmp_build}/include в качестве пути включения.
  • То же место, но --> компилятор GCC C++ --> включает добавление ${gmp_build}/include в качестве пути включения.
  • Там же --> Компилятор GCC C++ --> Разное добавьте -lgmp -lgmpxx в КОНЕЦ строки. КОНЕЦ ЛИНИИ!
  • Там же --> компилятор C GCC. Добавьте те же пути включения и разные параметры, что и раньше.
  • Там же --> Компоновщик MinGW C++ --> Библиотеки Добавьте в "Библиотеки (-l)" как gmpxx, так и gmp В ТАКОМ ПОРЯДКЕ! Теперь добавьте ${gmp_build}/lib в «Путь поиска библиотеки (-L)».
  • В C/C++ General --> Paths & Symbols --> вкладка Incudes убедитесь, что у вас есть ${gmp_build}/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 -lgmpxx -lgmp

Примечания:

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

2) Флаг -l хитрый. На самом деле он говорит: «Иди и поищи в -L‹что угодно› liblibrary.a». В этом случае "Поищите в C:\gmp\lib libgmp.a и libgmpxx.a".

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

4) Если вы поместите gmp перед gmpxx в компоновщике, ваши перегруженные операторы не будут работать.

person cassius    schedule 03.07.2013