Сборка статических библиотек для окон с использованием cygwin - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь создать CGAL для окон для использования в моем проекте под Visual Studio 2010. CGAL требует библиотеки GMP и MPFR и предоставляет их распределение. Однако он предоставляет их в виде пакета lib + dll, а я хочу, чтобы они статически компилировались в виде одного файла .lib.

Так что теперь я пытаюсь собрать GMP и MPFR как статическую библиотеку под Windows. Я использую Cygwin для этой цели, как предложено здесь . После вызова configure и make у меня есть выходные библиотеки с расширением .a с дополнительным файлом .la. Я не очень много знаю о статических библиотеках для Unix, поэтому я предположил, что это то же самое, что и .lib, только с другим расширением. Я переименовал его в .lib и связал с моим проектом - он хорошо подошел.

Первый вопрос : правильно ли я это сделал? Действительно ли файлы .a и .lib одинаковы? Я видел этот вопрос, но не нашел его достаточно полезным.

Тогда возникла проблема: у меня было

error LNK2019: unresolved external symbol ___getreent referenced in function ___gmp_default_reallocate

Похоже, что некоторые функции cygwin не связаны в результате gmp.lib. Я нашел здесь , что getreent может быть экспортировано из libcygwin.a. Поэтому я скопировал его в libcygwin.lib и связал с моим проектом. Не удивительно, что я получил следующую ошибку:

error LNK2005: _strcpy already defined in libcygwin.lib(t-d001719.o) in libcmtd.lib(strcat.obj) 

Конечно, я не могу знать, какие функции и как объявлены в этой библиотеке, и кажется, что strcpy конфликтует с функцией из Visual Studio. Я действительно хочу, чтобы gmp.lib был достаточно умен, чтобы статически связать эту функцию. Таким образом,

Второй вопрос : как заставить GMP связывать зависимости библиотек? или Как правильно собрать GMP для Windows без использования Cygwin?

1 Ответ

2 голосов
/ 24 февраля 2012

ОБНОВЛЕНИЕ: см. Страницу проекта MPIR для ответа на все ваши проблемы (это позволяет вам создать MPIR, GMP-совместимую библиотеку и MPFR с Visual Studio).Новая домашняя страница MPIR расположена здесь , но, насколько я могу судить, не хватает информации MPFR.


Вам не нужен Cygwin.

Вам нужнооболочка Bash и MinGW (.org / -w64).Если вы строите с помощью компилятора cygwin, вам нужно связать его с DLL-библиотекой Cygwin, которая в вашем случае глупа, поскольку GMP и MPFR оба могут быть собраны MinGW.

Единственное, что я не верюлюбая библиотека может быть построена с помощью MSVC, и MSVC не может связываться с библиотеками MinGW (именно поэтому авторы вашего проекта связывают библиотеки DLL и библиотеки импорта), поэтому вам нужно будет собрать все с MinGW GCC или использовать библиотеки DLL.


Ниже приведены инструкции по созданию статической библиотеки GCC для GMP и MPFR.

Чтобы создать GMP для Windows с MinGW-w64 GCC, вам потребуется MSYS .Распакуйте его куда-нибудь, например C: \ Dev \ msys, чтобы присутствовал C: \ Dev \ msys \ bin \ sh.exe.

Тогда вам потребуется GCC MinGW-w64:

(я рекомендую мои "Персональные сборки", особенно 4.6.3-1. Загрузите пакет 4.6.3-1-gcc_rubenvb.7z, но любой другой пакет MinGW должен сделать это)

Распакуйте его, чтобы сказать C: \ Dev \ mingw64, чтобы C: \ Dev \mingw64 \ bin \ gcc.exe существует.

Дважды щелкните C: \ Dev \ msys \ msys.bat.Введите:

export PATH=/c/Dev/mingw64/bin:$PATH

и нажмите ввод.Разархивируйте исходный код GMP и MPFR в каталог / home / USERNAME / *, создайте каталоги сборки и не забудьте использовать для конфигурации:

--enable-static --disable-shared --prefix=/easytemplibinstalldir

вместе с

--host=i686-w64-mingw32

для 32-разрядных или

--host=x86_64-w64-mingw32

для 64-разрядных.Я считаю, что GMP также требует, чтобы --build был установлен на то же значение.После того, как конфигурация завершится, введите make, а затем make install, опционально предшествующий make check.

Вы должны иметь libgmp.a в / easytemplibinstalldir / lib.Для MPFR добавьте

--with-gmp=/easytemplibinstalldir

в его строку конфигурации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...