Библиотека 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 ===|
Теперь некоторые дополнительные данные:
- У меня нет проблем с Си-функциями. А также, если я удаляю оператор cout<<, файл компилируется и работает нормально. Проблема, вероятно, с перегруженными операторами.
- libgmpxx.a и libgmp.a связаны с компилятором. Это можно увидеть и в сообщениях об ошибках...
- Проблема, вероятно, с одним libgmpxx.a. Итак, я снова построил библиотеку, но файлы те же.
- Я использовал этот учебник по сборке GMP с MSYS для MinGW. http://www.cs.nyu.edu/exact/core/gmp/ и http://suchideas.com/journal/2007/07/installing-gmp-on-windows/
- Используемая версия GMP - 5.0.4.
Итак, что я хочу знать, в чем может быть проблема? И как это можно решить? И, если неразрешимы и если у вас есть рабочие файлы для версии 5.0.4, пожалуйста, поделитесь им.:(
1 ответ
Я подозреваю, что команда для сборки вашей программы указывает libgmp*
библиотеки в неправильном порядке. Убедитесь, что libgmp.a
библиотека указана после libgmpxx.a
библиотека:
-lgmpxx -lgmp
Если они указаны в другом порядке, то при вытягивании зависимостей из libgmpxx.a
библиотека, libgmp.a
библиотека не будет найдена
От ld
документы линкера на -l
вариант:
Компоновщик будет искать архив только один раз в том месте, где он указан в командной строке. Если архив определяет символ, который не был определен в каком-либо объекте, который появился перед архивом в командной строке, компоновщик включит соответствующий файл (ы) из архива. Однако неопределенный символ в объекте, появляющемся позже в командной строке, не заставит компоновщик снова выполнить поиск в архиве.
Посмотрите опцию -(для способа заставить компоновщик искать архивы несколько раз.
Вы можете перечислить один и тот же архив несколько раз в командной строке.