Библиотека GMP, ошибка компиляции в C++, MinGW, Code::Blocks

Я построил GMP для MinGW. Я использую IDE Code::Blocks. У меня нет проблем с C-функциями GMP. Но у меня проблема с C++. Программа, которую я пытался запустить, настолько проста,

#include<iostream>
#include<gmpxx.h>
using namespace std;

main()
{
    mpz_class a;
    a=12345;
    cout<<"value"<<a<<"\n";
    return 0;
}

И ошибки, которые я получаю,

F:\Compilers\C_Libraries\GMP\lib\libgmpxx.a(osmpz.o):osmpz.cc|| undefined reference to `__gmpz_get_str'|
F:\Compilers\C_Libraries\GMP\lib\libgmpxx.a(osfuns.o):osfuns.cc:(.rdata+0x1c)||undefined reference to `__gmp_asprintf_memory'|
F:\Compilers\C_Libraries\GMP\lib\libgmpxx.a(osfuns.o):osfuns.cc:(.rdata+0x20)||undefined reference to `__gmp_asprintf_reps'|
F:\Compilers\C_Libraries\GMP\lib\libgmpxx.a(osdoprnti.o):osdoprnti.cc|| undefined reference to `__gmp_doprnt_integer'|
F:\Compilers\C_Libraries\GMP\lib\libgmpxx.a(osdoprnti.o):osdoprnti.cc|| undefined reference to `__gmp_asprintf_final'|
||=== Build finished: 5 errors, 0 warnings ===|

Теперь некоторые дополнительные данные:

  1. У меня нет проблем с Си-функциями. А также, если я удаляю оператор cout<<, файл компилируется и работает нормально. Проблема, вероятно, с перегруженными операторами.
  2. libgmpxx.a и libgmp.a связаны с компилятором. Это можно увидеть и в сообщениях об ошибках...
  3. Проблема, вероятно, с одним libgmpxx.a. Итак, я снова построил библиотеку, но файлы те же.
  4. Я использовал этот учебник по сборке GMP с MSYS для MinGW. http://www.cs.nyu.edu/exact/core/gmp/ и http://suchideas.com/journal/2007/07/installing-gmp-on-windows/
  5. Используемая версия GMP - 5.0.4.

Итак, что я хочу знать, в чем может быть проблема? И как это можно решить? И, если неразрешимы и если у вас есть рабочие файлы для версии 5.0.4, пожалуйста, поделитесь им.:(

1 ответ

Решение

Я подозреваю, что команда для сборки вашей программы указывает libgmp* библиотеки в неправильном порядке. Убедитесь, что libgmp.a библиотека указана после libgmpxx.a библиотека:

-lgmpxx -lgmp

Если они указаны в другом порядке, то при вытягивании зависимостей из libgmpxx.a библиотека, libgmp.a библиотека не будет найдена

От ld документы линкера на -l вариант:

Компоновщик будет искать архив только один раз в том месте, где он указан в командной строке. Если архив определяет символ, который не был определен в каком-либо объекте, который появился перед архивом в командной строке, компоновщик включит соответствующий файл (ы) из архива. Однако неопределенный символ в объекте, появляющемся позже в командной строке, не заставит компоновщик снова выполнить поиск в архиве.

Посмотрите опцию -(для способа заставить компоновщик искать архивы несколько раз.

Вы можете перечислить один и тот же архив несколько раз в командной строке.

Другие вопросы по тегам