A compilação do GNU Octave falha com libinterp / .libs / liboctinterp.so: referência indefinida para 'Magick :: *

2

Contexto

Meu uname -rv é 4.4.0-64-generic #85~14.04.1-Ubuntu SMP Mon Feb 20 12:10:54 UTC 2017 --- Meu compilador é GNU gcc 6.3.0 --- Eu estou compilando o GNU Octave a partir do código fonte. Eu tenho tentado compilar as versões do Octave 4.0.2, 4.2.0 e 4.2.1

Eu configuro a compilação com a invocação

${srcdir}/configure \
--prefix=/opt/octave/4.2.1 \
--with-java-homedir=/usr/lib/jvm/default-java \
--with-java-libdir=/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server 

Problema

Em todos os casos, o palco make falha com o seguinte erro

libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::ping(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::attribute(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::CoderInfo::description[abi:cxx11]() const'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::comment[abi:cxx11]() const'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::magick[abi:cxx11]() const'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::CoderInfo::CoderInfo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status

Evidence

Na preparação da instalação manual, eu executei sudo apt-get build-dep octave . Isto está relacionado à versão 3.8.1, que é atualmente suportada pelo Ubuntu 14.04. No entanto, achei que não poderia causar mal. (Sugestão do arquivo INSTALL.OCTAVE no diretório de origem)

Para ficar do lado seguro, instalei as bibliotecas libmagickcore-dev , libmagickwand-dev , libmagick++-dev do repositório do Ubuntu 8: 6.7.7.10-6ubuntu3.4). A questão surge com ou sem eles.

Por isso, dpkg -l | grep magick mostra

ii imagemagick 8:6.7.7.10-6ubuntu3.4 amd64 image manipulation programs
ii imagemagick-common 8:6.7.7.10-6ubuntu3.4 all image manipulation programs -- infrastructure
ii libgraphicsmagick++1-dev 1.3.18-1ubuntu3 amd64 format-independent image processing - C++ development files
ii libgraphicsmagick++3 1.3.18-1ubuntu3 amd64 format-independent image processing - C++ shared library
ii libgraphicsmagick1-dev 1.3.18-1ubuntu3 amd64 format-independent image processing - C development files
ii libgraphicsmagick3 1.3.18-1ubuntu3 amd64 format-independent image processing - C shared library
ii libmagick++-dev 8:6.7.7.10-6ubuntu3.4 amd64 object-oriented C++ interface to ImageMagick - development files
ii libmagick++5:amd64 8:6.7.7.10-6ubuntu3.4 amd64 object-oriented C++ interface to ImageMagick
ii libmagickcore-dev 8:6.7.7.10-6ubuntu3.4 amd64 low-level image manipulation library - development files
ii libmagickcore5:amd64 8:6.7.7.10-6ubuntu3.4 amd64 low-level image manipulation library
ii libmagickcore5-extra:amd64 8:6.7.7.10-6ubuntu3.4 amd64 low-level image manipulation library - extra codecs
ii libmagickwand-dev 8:6.7.7.10-6ubuntu3.4 amd64 image manipulation library - development files
ii libmagickwand5:amd64 8:6.7.7.10-6ubuntu3.4 amd64 image manipulation library

O estágio de configuração sai bem com o status 0.

(Observe que o estágio de configuração não é 100% infalível: uma tentativa anterior de construir falhou porque eu não tinha o gnulib instalado, que não havia sido detectado pelo configure)

O

link diz que as referências indefinidas são uma característica conhecida de liboctinterp.so , a partir do Octave 4.0.2. Ou esse comportamento com erros persiste no 4.2.0, ou há requisitos ocultos que estão faltando.

Pergunta

O que devo fazer para completar a compilação do Octave com sucesso?

    
por XavierStuvw 04.03.2017 / 17:11

1 resposta

0

O mesmo erro aqui, mas com um aviso sobre bibliotecas conflitantes logo acima, que foi a dica útil.

/usr/local/gcc-6.4.0_binutils-2.28.1_isl/lib64/gcc/x86_64-pc-linux-gnu/6.4.0/../../../../x86_64-pc-linux-gnu/bin/ld: warning: libjpeg.so.8, needed by /usr/lib/../lib64/libtiff.so, may conflict with libjpeg.so.62
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::ping(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::attribute(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::CoderInfo::description[abi:cxx11]() const'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::comment[abi:cxx11]() const'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::Image::magick[abi:cxx11]() const'
libinterp/.libs/liboctinterp.so: undefined reference to 'Magick::CoderInfo::CoderInfo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Espera-se que

Magick::Image::ping esteja na biblioteca c ++, vamos verificar qual deles foi usado:

ldd libinterp/.libs/liboctinterp.so | grep -i magick++
        libGraphicsMagick++.so.12 => /usr/local/gcc-6.4.0_binutils-2.28.1_isl/lib64/libGraphicsMagick++.so.12 (0x00007faa870ab000)

Mas Magick::Image::ping está realmente lá:

nm -C /usr/local/gcc-6.4.0_binutils-2.28.1_isl/lib64/libGraphicsMagick++.so | grep ping
000000000004c7a0 T Magick::Image::ping(Magick::Blob const&)
000000000004c740 T Magick::Image::ping(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

Por isso, algo estava impedindo o vinculador de usá-lo corretamente.

Outra pista de que o libGraphicsMagick ++. é bom: com o mesmo procedimento de construção , mesmas bibliotecas, a ramificação estável da oitava é construída bem enquanto a ramificação dev falha.

Vamos levar a sério o aviso anterior. Na verdade, era já mencionado que

Note that with openSUSE 12.04 but also with 13.02, libjpeg-devel package lead to libjpeg62.so installation, that may conflict with libjpeg8.so that is also installed. That's why we recommend to not install libjpeg-devel, but rather install libjpeg8-devel.

libjpeg62-devel tem que ser substituído por libjpeg8-devel , porque vários pacotes dependem de uma biblioteca jpeg.

Os seguintes comandos foram emitidos no openSUSE 42.2.

sudo zypper install libjpeg8-devel

Problem: libjpeg62-devel-62.2.0-35.3.1.x86_64 conflicts with namespace:otherproviders(libjpeg-devel) provided by libjpeg8-devel-8.1.2-119.5.x86_64
Solution 1: deinstallation of libjpeg62-devel-62.2.0-35.3.1.x86_64
Solution 2: do not install libjpeg8-devel-8.1.2-119.5.x86_64

Choose from above solutions by number or cancel [1/2/c] (c): 1

The following NEW package is going to be installed:
libjpeg8-devel

The following package is going to be REMOVED:
libjpeg62-devel

1 new package to install, 1 to remove.
Overall download size: 110.8 KiB. Already cached: 0 B. After the operation, additional 63.6 KiB will be used.
Continue? [y/n/...? shows all options] (y):

mas a biblioteca jpeg ainda está lá. Vamos encontrar o pacote:

zypper se -f /usr/lib64/libjpeg.so.62.2.0
+ | libjpeg62 | The MMX/SSE accelerated JPEG compression/decompression library | package

Remova a biblioteca:

sudo zypper rm libjpeg62
The following package is going to be REMOVED:
libjpeg62

Em seguida, recrie GraphicsMagick-1.3.28, instale. A construção da oitava passa agora.

    
por 03.03.2018 / 13:05