Почему Nettle 2.4 `configure` не может найти GMP 5.0.2? - PullRequest
3 голосов
/ 01 ноября 2011

Я пытаюсь собрать GnuTLS на сервере Mac OS X 10.5 (Leopard) (да, я знаю, он немного устарел, но сейчас этот сервер работает) и работает в здание проблемы Крапива : Я собрал и установил GMP , но configure Неттла не может его найти.

Я собрал и установил GMP 5.0.2 следующим образом (решение версии GCC от здесь ):

curl -O ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2
tar xjf gmp-5.0.2.tar.bz2
pushd gmp-5.0.2
CC=gcc-4.2 CXX=g++4.2 ./configure --prefix=/usr/local
make
sudo make install
popd

A make check проходит все тесты, и я получаю следующие установленные файлы GMP:

/usr/local/include/gmp.h
/usr/local/lib/libgmp.10.dylib
/usr/local/lib/libgmp.a
/usr/local/lib/libgmp.dylib
/usr/local/lib/libgmp.la
/usr/local/share/info/gmp.info
/usr/local/share/info/gmp.info-1
/usr/local/share/info/gmp.info-2

Однако, когда я пытаюсь собрать Nettle 2.4, выполните следующие действия:

curl -O http://www.lysator.liu.se/~nisse/archive/nettle-2.4.tar.gz
tar xzf nettle-2.4.tar.gz
pushd nettle-2.4
./configure --prefix=/usr/local
make
sudo make install
popd

Он успешно собирает и устанавливает, но не собирает libhogweed, потому что отсутствует GMP. После дальнейшей проверки я нашел следующие предупреждения в выводе configure:

checking for __gmpz_getlimbn in -lgmp... no
configure: WARNING: GNU MP not found, or not 3.1 or up, see http://gmplib.org/.
Support for public key algorithms will be unavailable.
checking for __gmpz_powm_sec... no

Очевидно, что GMP 5.0.2 новее, чем 3.1, плюс оба значения '__gmpz_getlimbn' & '__gmpz_powm_sec' определены в /usr/local/include/gmp.h, поэтому все в моей установке GMP кажется правильным.

Я перепробовал всевозможные опции configure (особенно в поисках опции типа --with-gmp) безрезультатно. Я также пытался использовать ту же версию GCC (CC=gcc-4.2 CXX=g++4.2 ./configure --prefix=/usr/local), что и для компиляции GMP, без изменений в результате. --includedir & --libdir следует установить на $PREFIX/include & $PREFIX/lib соответственно (особенно, поскольку я не указываю --exec-prefix), поэтому я не могу понять, почему он не сможет найти GMP.

Любые предложения будут очень оценены.

Обновление:

Я нашел следующее в config.log, объясняющем невозможность найти GMP:

configure:6469: checking for __gmpz_getlimbn in -lgmp
configure:6494: gcc -o conftest -g -O2   conftest.c -lgmp   >&5
ld warning: in /usr/local/lib/libgmp.dylib, file is not of required architecture
Undefined symbols:
  "___gmpz_getlimbn", referenced from:
      _main in ccNP0jza.o
ld: symbol(s) not found 
collect2: ld returned 1 exit status
configure:6494: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "nettle"  
| #define PACKAGE_TARNAME "nettle"
| #define PACKAGE_VERSION "2.4"  
| #define PACKAGE_STRING "nettle 2.4"
| #define PACKAGE_BUGREPORT "nettle-bugs@lists.lysator.liu.se"
| #define PACKAGE_URL ""
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1 
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1 
| #define HAVE_UNISTD_H 1
| #define TIME_WITH_SYS_TIME 1
| #define SIZEOF_LONG 4
| #define HAVE_OPENSSL_BLOWFISH_H 1
| #define HAVE_OPENSSL_DES_H 1
| #define HAVE_OPENSSL_CAST_H 1
| #define HAVE_OPENSSL_AES_H 1
| #define HAVE_ALLOCA_H 1
| #define HAVE_ALLOCA 1 
| #define HAVE_STRERROR 1
| #define HAVE_GCC_ATTRIBUTE 1
| #define HAVE_FCNTL_LOCKING 1
| /* end confdefs.h.  */
|
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char __gmpz_getlimbn ();
| int
| main ()
| {
| return __gmpz_getlimbn ();
|   ;
|   return 0;
| }
configure:6503: result: no
configure:6514: WARNING: GNU MP not found, or not 3.1 or up, see http://gmplib.org/.
Support for public key algorithms will be unavailable.

Running file /usr/local/lib/libgmp.dylib возвращает следующее:

/usr/local/lib/libgmp.dylib: Mach-O 64-bit dynamically linked shared library x86_64

На этом сервере установлен процессор Intel Core 2 Duo, поэтому 64-битная библиотека Маха выглядит мне корректно. Я не знаю, как определить, пытается ли Nettle построить для 32-битной или 64-битной архитектуры, поэтому я попытался CC=gcc-4.2 CXX=g++4.2 ABI=64 ./configure --prefix=/usr/local без изменений (также, даже если указать ABI=32 Nettle's configure всегда говорит «ABI» : стандарт "... не проходит через ABI?).

Будет ли какая-либо разница в перекомпиляции GMP в виде статической библиотеки? (Нет, GMP по умолчанию создает как статические, так и динамические библиотеки. Я указал оба выше при отображении всех установленных файлов.)

Ответы [ 2 ]

4 голосов
/ 27 ноября 2013

У меня была такая же проблема с версией 2.7.В итоге я заставил его работать в / usr / local с помощью:

export CPPFLAGS="-I/usr/local/include"
export LDFLAGS="-L/usr/local/lib"
./configure

Никакая игра с опциями ./configure напрямую не заставит libnettle распознать libgmp для меня.

1 голос
/ 10 ноября 2011

Оказывается, есть ошибка в config.guess, включенная в Nettle 2.4, которая не определяет правильный 32-битный / 64-битный тип в Mac OS X, поэтому по умолчанию он был 32-битным и не мог найти символы в библиотеке GMP (которая была скомпилирована как 64-битная библиотека). Как отметил разработчик Nettle здесь , вы можете просто загрузить последнюю версию config.guess и отключить ассемблер.

Более новый config.guess не работал для меня, поэтому я перевел его в 64-битный режим и отключил ассемблер. Окончательные рабочие инструкции по сборке для Libnettle (и libhogweed; не включая зависимость от GMP):

curl -O http://www.lysator.liu.se/~nisse/archive/nettle-2.4.tar.gz
tar xzf nettle-2.4.tar.gz
pushd nettle-2.4
CFLAGS="-m64" ./configure --prefix=/usr/local --disable-assembler
make
sudo make install
popd
...