Проблема библиотеки HDF5 и GSL на 64-разрядной Ubuntu 14.04.1

Я столкнулся с ошибками в установке FDTD программное обеспечение MEEP на Ubuntu. Хотя я имею hdf5-tools и libhdf5 установленный в моей системе (64-разрядная Ubuntu 14.04.1), make шаг установки MEEP возвращает ошибку как в этой ссылке paste.bin. Я настроил MEEP со следующей командой:

./configure --with-mpi --with-hdf5=/usr/lib/x86_64-linux-gnu/  > configure.out

Я затем работал make который закончился по ошибке, и я не мог работать make install впоследствии. Не указывая --with-hdf5 отметьте сценарий конфигурации, используемый для возврата предупреждения следующим образом:

configure: WARNING: Couldn't find the HDF5 library!! Switching to ...

После установки многочисленных библиотек HDF5 была волшебно разрешена проблема; однако, это все еще присутствовало, когда я использовал флаг --with-hdf5=/usr/lib/x86_64-linux-gnu/. Но без флага все установленное безупречно (я протестировал программу впоследствии и подтвердил, что это работало как ожидалось.) кроме GNU Научная связь Библиотеки. Мои вопросы следующие:

  1. Как местоположение библиотеки может быть расположено от командной строки? Выполняет команду locate hdf5 в случае HDF5 и нахождения пути файлов, заканчивающихся .so, .a достаточно?
  2. Как мог GNU Научная Библиотека быть представленным конфигурации и сделать сценарии?
  3. Сделайте environmental variables LDFLAGS, CPPFLAGS и LD_LIBRARY_PATH имеют какое-либо отношение к конфигурации и делают сценарии, распознающие эти библиотеки. Я думаю, что они имеют, так как они упоминаются в инструкциях по установке MEEP, и MEEP устанавливают учебное руководство. Я ценил бы его, если кто-то может объяснить, как они и переменная LIB связаны с процессами установки.

Спасибо за то, что заняли время,

P.S.: При необходимости я могу предоставить дополнительные документы. Я не помещал сценарий конфигурации и т.д., так как я не знаю, какой автоматически сгенерирован и который не (то же идет для make).

0
задан 16 December 2014 в 07:03

2 ответа

Отвечать на этот вопрос хорошо действительно требует полного понимания GNU autotools, который я не имею: тем не менее, я надеюсь, что эти комментарии помогут.

Настраивать сценарий для конкретной сборки сгенерирован от ее configure.ac использования файла autoconf. В свою очередь configure.ac использует стандартные макросы для тестирования на присутствие указанных компонентов. В данном случае configure.ac указывает тест AC_CHECK_LIB для библиотеки GSL как

  AC_CHECK_LIB(gsl, gsl_sf_bessel_Jn, [],
        [AC_MSG_WARN([Missing GNU GSL library...Bessel-function field initialization will not be supported.])])

Синтаксис AC_CHECK_LIB

AC_CHECK_LIB (library, function, [action-if-found], [action-if-not-found], [other-libraries])

и фактический механизм, которым выполнена проверка, путем создания минимальной тестовой программы (conftest) для указанной функции gsl_sf_bessel_Jn в библиотеке libgsl, и попытка связать его с помощью инструментов сборки по умолчанию. Такая минимальная программа могла бы посмотреть что-то как

char gsl_sf_bessel_Jn();

int main() { return gsl_sf_bessel_Jn(); return 0; }

Обратите внимание что фиктивный прототип char gsl_sf_bessel_Jn() не может перенести отношение к типу возврата или списку аргументов фактической функции - мы никогда не пытаемся запустить программу, мы просто хотим знать, связывается ли это (т.е. может ли компоновщик разрешить справочные руководства по библиотеке). Мы видим, как это работает, если мы создаем такой исходный файл сами:

$ cat > conftest.c
char gsl_sf_bessel_Jn();

int main() { return gsl_sf_bessel_Jn(); return 0; }

Ctrl+D

Как ожидалось, если мы пытаемся выполнить его, не связывая библиотеку GSL, мы получаем ошибку

$ gcc conftest.c
/tmp/ccWqFraS.o: In function `main':
conftest.c:(.text+0xa): undefined reference to `gsl_sf_bessel_Jn'
collect2: error: ld returned 1 exit status

Однако, даже если мы явно связываемся libgsl мы находим

$ gcc conftest.c -lgsl
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgsl.so: undefined reference to `cblas_dasum'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgsl.so: undefined reference to `cblas_sger'
.
<snip>
.
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgsl.so: undefined reference to `cblas_zdotu_sub'
collect2: error: ld returned 1 exit status

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

Это иллюстрирует важность порядка, в котором выполняются тесты: каждый успешный тест заставляет недавно обнаруженную библиотеку быть добавленной к $LIB переменная для последующих тестов. Конкретно (как отмечено в документации GSL)

Важно проверить на libm и libgslcblas прежде libgsl, иначе тесты перестанут работать. Принятие библиотек найдено, вывод во время настраивать этапа похож на это,

checking for cos in -lm... yes 
checking for cblas_dgemm in -lgslcblas... yes 
checking for gsl_blas_dgemm in -lgsl... yes 

Если библиотека будет найдена затем, то тесты определят макросы HAVE_LIBGSL, HAVE_LIBGSLCBLAS, HAVE_LIBM и добавят, что опции-lgsl-lgslcblas-lm к переменной ОСВОБОЖДАЮТ.


meep исходный пакет действительно проверяет на libgslcblas прежде libgsl, однако определенная проверка, которую он делает, является AC_CHECK_FUNC, а не AC_CHECK_LIB

AC_CHECK_FUNC(cblas_cgemm, [], [AC_CHECK_LIB(gslcblas, cblas_cgemm)])

В то время как поверхностно подобный, кажется, что AC_CHECK_FUNC не добавляет библиотеку к $LIBS на успехе; кажется, что мы можем работать вокруг этого просто путем добавления явного AC_CHECK_LIB для libgslcblas в configure.ac файле

# GNU Scientific Library
AC_CHECK_FUNC(cblas_cgemm, [], [AC_CHECK_LIB(gslcblas, cblas_cgemm)])
AC_CHECK_LIB([gslcblas],[cblas_cgemm])
AC_CHECK_LIB(gsl, gsl_sf_bessel_Jn, [],
   [AC_MSG_WARN([Missing GNU GSL library...Bessel-function field initialization will not be supported.])])

и затем выполнение autoconf повторно создавать настраивать сценарий

$ autoconf

после которого выполнения ./configure отчеты, что библиотека GSL действительно найдена:

$ ./configure --prefix=/usr/local | grep gsl
configure: WARNING: Cannot find latex2html in your path!
configure: WARNING: FFTW needed for MPB
checking for cblas_cgemm in -lgslcblas... yes
checking for gsl_sf_bessel_Jn in -lgsl... yes
1
ответ дан 6 October 2019 в 06:41

склонный - добираются, устанавливают пакеты от http://packages.ubuntu.com/ репозиторий. Кэш Ubuntu все метаданные пакетов в компьютере. Можно искать пакеты с помощью следующей команды.

sudo apt-cache search "package keyword"

ищут библиотеку HDF5 в хранилище пакетов человечности.

sudo apt-cache search "hdf5"

команда покажет пакеты, касающиеся hdf5.

устанавливают соответствующий пакет на Вас.

sudo apt-get install package-name. 

главным образом необходимо установить hdf5-инструменты, h5utils, таблицы Python.

0
ответ дан 6 October 2019 в 06:41

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

Похожие вопросы: