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~ 해야 하다교체됨, 여러 패키지가 jpeg libjpeg8-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하고 구축했습니다.

관련 정보