Как собрать mpir-2.4.0 с помощью Visual Studio 2010? - PullRequest
2 голосов
/ 07 августа 2011

Я следовал инструкции Рика Рейгана http://www.exploringbinary.com/how-to-install-and-run-gmp-on-windows-using-mpir/. К сожалению, по некоторым причинам статическая библиотека работает только с C. Для C ++ компилятор всегда жалуется на проблемы с компоновщиком.Есть несколько различий между текущей версией, которую я использую (2.4.0), и версией Рика Ригана.С другой стороны, я также следовал readme.txt внутри папки build.vc10, но все еще не мог понять, почему она сломалась.Я использую Windows 7 x64 и использую Visual Studio 2010 - Ultimate.Чтобы быть более конкретным:

  • Во-первых, я загружаю исходный код MPIR версии 2.4.0 из http://www.mpir.org/, т.е. Source tarball bz2.
  • Далее я загружаю yasm с http://yasm.tortall.net/Download.html. Я загружаю Win64.exe и Win64 VS2010.zip и помещаю их обоих в мой каталог VC\bin.Я также переименовал yasm-1.1.0-win64.exe в yasm.exe
  • . Затем я открываю папку mpir.sln в build.vc10 и собираю все проекты lib в режиме release, так как я просто хочу использовать статическийбиблиотеки.

После создания этих решений создается папка с именем Win32, и внутри этой папки есть еще одна папка с именем Release, в которой находятся четыре других файла библиотеки:

  • mpir.lib
  • mpirrxx.lib
  • mpir.pdb
  • mpirxx.pdb

enter image description here

Кроме того, папка lib внутри build.vc10 также создает две другие папки:

  • Win32 enter image description here

  • x64
    enter image description here

Затем я скопировал все файлы библиотеки с build.vc10\lib на мой C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include, а также mpir.h и mpirxx.h на мой C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include.
После завершения всех этих шагов я создаю проект консольного приложения Win32 и добавляю два Additional Options в Project Properties\Linker\Command Line\.Это:

  • mpir.lib
  • mpirxx.lib

Затем я собрал несколько примеров с C, и все заработало, как и ожидалось.Тем не менее, когда я попробовал этот конкретный пример:

#include <iostream>
using namespace std;

#pragma warning(disable: 4800)
#include <mpirxx.h>
#pragma warning(default: 4800)

int main (int argc, char *argv[])
{
    mpz_class aBigPO2;

    aBigPO2 = 1073741824; //2^30
    aBigPO2*=aBigPO2; //2^60
    aBigPO2*=aBigPO2; //2^120
    aBigPO2*=aBigPO2; //2^240
    aBigPO2*=aBigPO2; //2^480
    aBigPO2*=aBigPO2; //2^960
    aBigPO2*=aBigPO2; //2^1920

    cout << aBigPO2 << endl;
}

Сбой со многими ошибками:

1>main.obj : error LNK2001: unresolved external symbol ___gmpz_set_si
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_init
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_mul
1>main.obj : error LNK2001: unresolved external symbol ___gmpz_clear

И я понятия не имею, почему это произошло.Я даже пытался скопировать другие альтернативы из папки Win32, но все равно выдает те же ошибки.Но я не уверен, насколько эти файлы отличаются.Я использую Windows 7 x64, но я не думаю, что у меня Visual Studio x64.Интересно, смешивание 32 и 64 бит может вызвать эту проблему.Любая идея?Спасибо.

Ответы [ 2 ]

1 голос
/ 03 декабря 2012

Полагаю, вы создали библиотеки x64? Я сделал, а затем столкнулся с аналогичными проблемами, что вы застряли Убедитесь, что ваш MSVC-проект правильно настроен для использования с библиотеками x64 ... эта ссылка должна помочь: Как скомпилировать 64-битное приложение с использованием Visual C ++ 2010 Express?

1 голос
/ 07 августа 2011

Несмотря на то, что вы создали версию выпуска MPIR, вы используете ее в отладочной версии вашего собственного проекта.Создайте отладочную версию MPIR или переключитесь на версию выпуска вашего проекта.

...