Problema de biblioteca HDF5 e GSL no Ubuntu 14.04.1 64 bits

0

Ocorreu erros na instalação do FDTD software MEEP em Ubuntu.Ambora eu tenha hdf5-tools e libhdf5 instalado no meu sistema (Ubuntu 14.04.1 64-bit), a etapa make da instalação de MEEP retorna um erro como em este link paste.bin . Eu configurei MEEP com o seguinte comando:

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

Em seguida, executei make , o que resultou em erro e não consegui executar make install posteriormente. Sem especificar o --with-hdf5 sinalizar o script de configuração usado para retornar um aviso da seguinte forma:

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

Depois de instalar várias bibliotecas HDF5, o problema foi resolvido magicamente; no entanto, ainda estava presente quando usei o sinalizador --with-hdf5=/usr/lib/x86_64-linux-gnu/ . Mas sem a bandeira tudo instalado na perfeição (eu testei o programa depois e confirmei que ele estava funcionando como esperado), exceto o link da Biblioteca Científica GNU. Minhas perguntas são as seguintes:

  1. Como o local da biblioteca pode ser localizado no prompt de comando? Está executando o comando locate hdf5 no caso do HDF5 e encontrando o caminho dos arquivos que terminam com .so , .a suficiente?
  2. Como a biblioteca científica do GNU pode ser introduzida na configuração e fazer scripts?
  3. Os environmental variables LDFLAGS , CPPFLAGS e LD_LIBRARY_PATH têm algo a ver com a configuração e fazem scripts reconhecendo essas bibliotecas. Eu acho que eles já foram mencionados em instruções de instalação do MEEP e MEEP instale o tutorial . Eu agradeceria se alguém pudesse explicar como estas e a variável LIB estão relacionadas com os procedimentos de instalação.

Obrigado por dedicar seu tempo,

P.S: Se necessário, posso fornecer documentos adicionais. Eu não coloquei o script de configuração, etc, pois eu não sei qual é gerado automaticamente e qual não é (o mesmo vale para make ).

    
por Vesnog 16.12.2014 / 15:03

2 respostas

1

Para responder a esta pergunta, realmente é necessário um entendimento completo do GNU autotools , o qual eu não tenho: no entanto, espero que estes comentários ajudem.

O script de configuração para uma construção específica é gerado a partir de seu arquivo configure.ac usando autoconf . Por sua vez, o configure.ac usa macros padrão para testar a presença de componentes especificados. Neste caso particular, configure.ac especifica um teste AC_CHECK_LIB para a biblioteca GSL como

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

A sintaxe de um AC_CHECK_LIB é

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

e o mecanismo real pelo qual a verificação é executada é criando um programa de teste mínimo ( conftest ) para a função especificada gsl_sf_bessel_Jn na biblioteca libgsl e tentando vinculá-lo usando as ferramentas de compilação padrão. Um programa tão mínimo pode parecer algo como

char gsl_sf_bessel_Jn();

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

Note que o protótipo fictício char gsl_sf_bessel_Jn() pode não ter relação com o tipo de retorno ou com a lista de argumentos da função real - nós nunca tentamos executar o programa, apenas desejamos saber se ele vincula (ou seja, se o vinculador é capaz de resolver referências de biblioteca). Podemos ver como isso funciona se criarmos esse arquivo fonte por nós mesmos:

$ cat > conftest.c
char gsl_sf_bessel_Jn();

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

Ctrl + D

Como esperado, se tentarmos executá-lo sem vincular a biblioteca GSL, obteremos um erro

$ 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

No entanto, mesmo que explicitamente vinculemos libgsl , encontramos

$ 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

Neste ponto, é importante observar que o script de configuração não sabe por que um teste em particular falhou, apenas isso. Nesse caso, falhou porque não vinculamos a biblioteca libgslcblas subordinada.

Isso ilustra a importância da ordem em que os testes são executados: cada teste bem-sucedido faz com que a biblioteca recém-descoberta seja adicionada à variável $LIB para testes subseqüentes. Especificamente (como observado na documentação da GSL )

% bl0ck_qu0te%

O pacote de fontes meep faz checar por libgslcblas antes de libgsl, entretanto a checagem específica que ele faz é um AC_CHECK_FUNC ao invés de um AC_CHECK_LIB

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

Embora superficialmente semelhante, parece que AC_CHECK_FUNC não anexa a biblioteca a $LIBS em sucesso; parece que podemos contornar isso simplesmente adicionando um AC_CHECK_LIB explícito para libgslcblas no arquivo 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.])])

e, em seguida, executando autoconf para gerar novamente o script de configuração

$ autoconf

após o qual executar ./configure informa que a biblioteca GSL está realmente encontrada:

$ ./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
    
por steeldriver 17.12.2014 / 02:54
0

apt-get instala os pacotes do repositório link . O Ubuntu armazena em cache todos os metadados dos pacotes no computador. Você pode pesquisar seus pacotes usando o seguinte comando.

sudo apt-cache search "package keyword"

pesquise a biblioteca HDF5 no repositório de pacotes do Ubuntu.

sudo apt-cache search "hdf5"

O comando mostrará os pacotes relacionados ao hdf5.

instale o pacote relevante para você.

sudo apt-get install package-name. 

principalmente você tem que instalar o hdf5-tools, h5utils, python-tables.

    
por Hafiz Shehbaz Ali 05.02.2016 / 07:35