2개의 라이브러리가 나란히 설치되어 있으며 둘 다 필요합니다. 연결 문제를 방지할 수 있는 솔루션은 무엇입니까?

2개의 라이브러리가 나란히 설치되어 있으며 둘 다 필요합니다. 연결 문제를 방지할 수 있는 솔루션은 무엇입니까?

내 우분투 16.04 시스템에 두 가지 버전의 openCV가 설치되어 있습니다. 하나는 openCV3이고 다른 하나는 openCV2.4이며 둘 다 필요합니다. 하지만 이제 openCV3용 C++ 코드를 컴파일할 수 없습니다. 내 코드를 컴파일하려고 할 때 수많은 링커 오류가 발생합니다. openvc2.4를 설치하기 전에는 항상 잘 컴파일되었습니다.

내가 받는 오류 유형은 다음과 같습니다.

In file included from main.cpp:10:0:
/usr/local/include/opencv2/imgproc.hpp:4090:5: note: previous declaration ‘cv::ColormapTypes COLORMAP_PINK’
     COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg)
     ^
In file included from /usr/local/include/opencv2/opencv.hpp:59:0,
                 from include/faceDetection.h:6,
                 from main.cpp:11:
/usr/local/include/opencv2/contrib/contrib.hpp:980:24: error: redeclaration of ‘COLORMAP_HOT’
         COLORMAP_HOT = 11
                        ^
In file included from main.cpp:10:0:
/usr/local/include/opencv2/imgproc.hpp:4091:5: note: previous declaration ‘cv::ColormapTypes COLORMAP_HOT’
     COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg)
     ^
main.cpp: In function ‘int main(int, char**)’:
main.cpp:89:65: error: call of overloaded ‘createFisherFaceRecognizer()’ is ambiguous
     Ptr<BasicFaceRecognizer> model = createFisherFaceRecognizer();
                                                                 ^
In file included from /usr/local/include/opencv2/face.hpp:373:0,
                 from main.cpp:8:
/usr/local/include/opencv2/face/facerec.hpp:99:39: note: candidate: cv::Ptr<cv::face::BasicFaceRecognizer> cv::face::createFisherFaceRecognizer(int, double)
 CV_EXPORTS_W Ptr<BasicFaceRecognizer> createFisherFaceRecognizer(int num_components = 0, double threshold = DBL_MAX);
                                       ^
In file included from /usr/local/include/opencv2/opencv.hpp:59:0,
                 from include/faceDetection.h:6,
                 from main.cpp:11:
/usr/local/include/opencv2/contrib/contrib.hpp:963:38: note: candidate: cv::Ptr<cv::FaceRecognizer> cv::createFisherFaceRecognizer(int, double)
     CV_EXPORTS_W Ptr<FaceRecognizer> createFisherFaceRecognizer(int num_components = 0, double threshold = DBL_MAX);
                          ^
main.cpp:93:48: error: no matching function for call to ‘cv::face::BasicFaceRecognizer::train(std::vector<cv::Mat>&, std::vector<int>&)’
     model->train(trainImages, labelsTrainImages);
                                                ^
In file included from main.cpp:8:0:
/usr/local/include/opencv2/face.hpp:207:26: note: candidate: virtual void cv::face::FaceRecognizer::train(int, int)
     CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels) = 0;
                          ^
/usr/local/include/opencv2/face.hpp:207:26: note:   no known conversion for argument 1 from ‘std::vector<cv::Mat>’ to ‘int’
main.cpp:123:64: error: no matching function for call to ‘cv::face::BasicFaceRecognizer::predict(cv::Mat&, int&, double&)’
                 model->predict(face, predictedLabel, confidence);
                                                                ^
In file included from main.cpp:8:0:
/usr/local/include/opencv2/face.hpp:259:35: note: candidate: int cv::face::FaceRecognizer::predict(int) const
     CV_WRAP_AS(predict_label) int predict(InputArray src) const;

내 컴파일된 명령:

g++ src/faceDetection.cpp src/faceRecognition.cpp main.cpp -L/usr/local/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm               -lopencv_bioinspired -lopencv_ccalib -lopencv_dpm -lopencv_fuzzy -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_saliency -lopencv_stereo               -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_face -lopencv_plot               -lopencv_dnn -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect               -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core -o main 

/usr/local/include는 다음과 같습니다.

$ ls /usr/local/include/
        folly  opencv  opencv2  wangle

$ls /usr/local/include/opencv
        cvaux.h  cvaux.hpp  cv.h  cv.hpp  cvwimage.h  cxcore.h  cxcore.hpp  cxeigen.hpp  cxmisc.h  highgui.h  ml.h

$ ls /usr/local/include/opencv2
        aruco            contrib     dpm.hpp         fuzzy.hpp      imgproc.hpp          ocl                   plot.hpp      stereo.hpp            text          videostab
        aruco.hpp        core        face            gpu            legacy               opencv.hpp            reg           stitching             text.hpp      videostab.hpp
        bgsegm.hpp       core.hpp    face.hpp        hdf            line_descriptor      opencv_modules.hpp    rgbd          stitching.hpp         tracking      xfeatures2d
        bioinspired      cvconfig.h  features2d      hdf.hpp        line_descriptor.hpp  optflow               rgbd.hpp      structured_light      tracking.hpp  xfeatures2d.hpp
        bioinspired.hpp  cvv         features2d.hpp  highgui        ml                   optflow.hpp           saliency      structured_light.hpp  ts            ximgproc
        calib3d          cvv.hpp     flann           highgui.hpp    ml.hpp               phase_unwrapping      saliency.hpp  superres              video         ximgproc.hpp
        calib3d.hpp      datasets    flann.hpp       imgcodecs      nonfree              phase_unwrapping.hpp  shape         superres.hpp          video.hpp     xobjdetect.hpp
        ccalib           dnn         freetype.hpp    imgcodecs.hpp  objdetect            photo                 shape.hpp     surface_matching      videoio       xphoto
        ccalib.hpp       dnn.hpp     fuzzy           imgproc        objdetect.hpp        photo.hpp             stereo        surface_matching.hpp  videoio.hpp   xphoto.hpp

/usr/lib/x86_64-linux-gnu의 내용:http://paste.ubuntu.com/25261998/.

답변1

OpenCV3는 헤더를 opencv버전 3 콘텐츠용 폴더와 opencv2이전 버전과 호환되는 콘텐츠용 폴더에 설치합니다. OpenCV3 이후에 OpenCV2.4를 빌드하고 설치하면 실제로 헤더를 덮어쓰게 될 수 있습니다. 라이브러리 자체에는 버전이 있지만 헤더에는 없습니다.

두 버전을 모두 설치하는 것이 적합한지 잘 모르겠지만 이유가 있는 경우 혼동을 피하기 위해 두 버전을 모두 제거하고 기본 위치에 OpenCV3을 다시 설치한 다음 OpenCV2에 대해 다른 경로 접두사(예: /opt/opencv2.

그런 다음 OpenCV2에 대해 무언가를 빌드할 때 /opt/opencv2/include포함 경로와 설정 LD_LIBRARY_PATH=/opt/opencv2/lib(빌드 및 실행을 위한)을 제공합니다.

이를 사용하여 cmake프로젝트를 빌드하는 경우 스크립트를 조정(또는 생성)해야 합니다 FindOpencv.cmake.

답변2

젠투에서는 슬롯을 지원합니다... 이는 동일한 시스템에 서로 다른 버전의 패키지가 공존할 수 있음을 의미합니다.

이는 패키지 관리자(포티지)가 패키지의 공통 이름과 다양한 버전 이름을 사용하여 심볼릭 링크를 생성하기 때문에 가능합니다.

예를 들어, Python 2와 3이 있는 경우... python특정 버전(2 또는 3)을 가리키는 심볼릭 링크라는 하나만 있고 심볼릭 링크가 가리키는 버전을 처리하는 스크립트가 있습니다.

헤더에 대해 동일한 작업을 수행하고 하나를 만들고 opencv.h두 개의 서로 다른 헤더 파일을 가질 수 있을 것 같습니다. 그런 다음 원본 파일을 .h 파일 중 하나에 연결할 수 있습니다.

직접 만들고 싶지 않고 이미 가지고 있는 것과 동일한 논리를 만들고 싶다면 gentoo를 시도해 볼 수 있습니다.

답변3

공유 라이브러리 폴더에는 so 파일의 두 버전이 모두 설치됩니다. -l을 지정하면 gcc기본값은 더 높은 SONAME으로 설정됩니다. 귀하의 경우에는 2.4인 것 같습니다. 아마도이것Stack Overflow에 대한 답변이 도움이 될 수 있습니다(두 번째 답변이 최고의 IMHO입니다).

관련 정보