libinterp/.libs/liboctinterp.soによりGNU Octaveのコンパイルが失敗する: `Magick::*への未定義参照

libinterp/.libs/liboctinterp.soによりGNU Octaveのコンパイルが失敗する: `Magick::*への未定義参照

コンテキスト

私のuname -rvもの4.4.0-64-generic #85~14.04.1-Ubuntu SMP Mon Feb 20 12:10:54 UTC 2017---私のコンパイラはGNU gcc 6.3.0です。 ---ソースからGNU Octaveをコンパイルしています。私はOctaveバージョン4.0.2、4.2.0、4.2.1をコンパイルしようとしました。

呼び出し構成を使用してビルドします。

${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 

質問

いずれの場合も、次のエラーにより make ステップが失敗します。

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

証拠

手動インストールを準備しながら、sudo apt-get build-dep octave現在Ubuntu 14.04でサポートされているバージョン3.8.1に関連しています。しかし、病気ではないと思います。 (ソースディレクトリのINSTALL.OCTAVEファイルで提案)

安全のために、Ubuntuリポジトリ8:6.7.7.10-6ubuntu3.4にライブラリをインストールしましたlibmagickcore-dev。問題があるかどうかにかかわらず、問題が発生します。libmagickwand-devlibmagick++-dev

したがって、dpkg -l | grep magickそれを示しています

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

構成ステップは状態 0 で正常に終了します。

(設定ステップが100%完璧ではありません。インストールがなく、設定がgnulibキャプチャされていないため、以前のビルドに失敗しました。)

https://stackoverflow.com/questions/39228019/error-while-compiling-octave-with-gccliboctinterp.soOctave 4.0.2以降、未定義の参照が既知の機能であることを示します。このバグのある動作は、4.2.0 で持続するか、または私が見逃した隠された要件があります。

質問

Octaveの編集を正常に完了するにはどうすればよいですか?

ベストアンサー1

ここにも同じエラーがありますが、競合するライブラリに関する警告があります。これは便利な手がかりです。

/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&)'

Magick::Image::pingこれはC ++ライブラリにあると予想されます。どのライブラリが使用されているかを見てみましょう。

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)

しかしMagick::Image::pingそれは存在します:

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&)

したがって、リンカーがそれを正しく使用できないという問題があります。

libGraphicsMagick++.so は別の手がかりとして良いです。建設手順、同じライブラリ、Octave安定ブランチは正常に構築されますが、開発ブランチは失敗します。

前の警告を真剣に受け入れよう実際にすでに気付いたそれ

openSUSE 12.04および13.02では、libjpeg-develパッケージのためにlibjpeg62.soがインストールされ、これもインストールされているlibjpeg8.soと競合する可能性があります。そのため、libjpeg-develではなくlibjpeg8-develをインストールすることをお勧めします。

libjpeg62-devel〜しなければならない交換済みこれは、複数のパッケージがjpeglibjpeg8-develライブラリに依存しているためです。

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):

ただし、JPEGライブラリはまだ存在します。このパッケージを見てみましょう:

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

ライブラリの削除:

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

次に、GraphicsMagick-1.3.28を再構築してインストールします。これでオクターブ構成が通過しました。

おすすめ記事