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を再構築してインストールします。これでオクターブ構成が通過しました。

答え2

私は(RHEL7で)同じ問題を経験し、偶然この問題を発見しました。だから解決策を共有したいと思いました。

ldd以下で実行すると、依存libinterp/.libs/liboctinterp.so関係がないことを示しますlibGraphicsMagick++.so。 config.logをチェックしたところ、設定がライブラリではなくヘッダファイルのみを見つけることがわかりました。実行後にオプションconfigure --helpが見つかりました--with-magick=LIB。だからそれを追加し--with-magick=/path/to/libGraphicsMagick++.soて構築しました。

関連情報