2017-08-10 131 views
12

私のコンピュータではUbuntu-16.04-LTSが動作しており、OpenCV-2.4.13は既にインストールされています。しかし、OpenCVの新しいバージョン(OpenCV-3.2.0など、古いバージョンを削除せずに)の機能を使用したいと思います。OpenCVの複数のバージョンを同じコンピュータで実行する

これまでのところOpenCV-3.2.0をダウンロードしてコンパイルしてインストールしました。私はcmakeのは、OpenCVのをコンパイルするuingていますので、私はに私のCMakeLists.txtファイルを変更:私は、コードのこの小さな作品、

#include <iostream> 
#include "opencv2/core/version.hpp" 

int main(int argc, char ** argv) 
{ 
    std::cout << "OpenCV version: " 
      << CV_MAJOR_VERSION << "." 
      << CV_MINOR_VERSION << "." 
      << CV_SUBMINOR_VERSION 
      << std::endl; 
    return 0; 
} 

を実行したときに、私が取得今

cmake_minimum_required (VERSION 3.2) 

project(io) 

find_package(OpenCV REQUIRED) 

include_directories("/home/ubuntu/opencv-3.2.0/include") # directory of OpenCV-3.2.0 
link_directories("/home/ubuntu/opencv-3.2.0/lib") # directory of OpenCV-3.2.0 

add_executable(cv_io io.cpp) 

target_link_libraries(cv_io ${OpenCV_LIBS}) 

OpenCV version: 3.2.0

OpenCV version 2.4.13

私はこれらすべての未定義の参照エラーが発生します

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/opencv.hpp> 

int main() 
{ 
    cv::Mat img = cv::imread("ferrari.jpg"); 

    cv::Mat dst; 
    cv::Sobel(img, dst, CV_32F, 1, 1); 

    cv::imwrite("ferrari_sobel.png", dst); 

    cv::VideoCapture input(0); 
} 

だからすべては、私のようないくつかの実際のOpenCVの関数の実行を開始する場合を除いて、順序であるように思わ

CMakeFiles/cv_io.dir/io.cpp.o: In function main': io.cpp:(.text+0x40): undefined reference to cv::imread(cv::String const&, int)' io.cpp:(.text+0xd4): undefined reference to cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)' CMakeFiles/cv_io.dir/io.cpp.o: In function cv::String::String(char const*)': io.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x40): undefined reference to cv::String::allocate(unsigned long)' CMakeFiles/cv_io.dir/io.cpp.o: In function cv::String::~String()': io.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x10): undefined reference to cv::String::deallocate()' CMakeFiles/cv_io.dir/io.cpp.o: In function cv::String::operator=(cv::String const&)': io.cpp:(.text.ZN2cv6StringaSERKS0[ZN2cv6StringaSERKS0]+0x2c): undefined reference to `cv::String::deallocate()' collect2: error: ld returned 1 exit status CMakeFiles/cv_io.dir/build.make:121: recipe for target 'cv_io' failed make 2 : * [cv_io] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/cv_io.dir/all' failed make 1 : * [CMakeFiles/cv_io.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2

は、誰もが解決する方法を知っていますこの問題?問題は、私がまだCMakeLists.txtにすべてのライブラリを正しくリンクしていないということです。また、私は経験しているものに似て何かを言及a comment below this articleを見つけましたが、私は理解していませんthe page containing the solutionそれは参照しています。 私はOpenCVとCMakeにはとても新しいので、できるだけ明示的に指示してください。私は永遠にこれに固執しているので、どんな助けも高く評価されています!どうもありがとうございました!

+0

2つのOpenCVバージョンを構成するのは苦労します。君の気持ち、分かるよ。 – Yotam

+0

興味があれば、Dockerコンテナで2つのバージョンを実行できます。システム全体のパッケージに影響を与えずに複数のバージョンを構成する方がはるかに簡単です – Srinivas

+1

@Srinivasこれはちょっと過酷で重いように見えますが。 –

答えて

3

あなたは私がdauntingly古いUbuntuの12.04(それはない自分のコンピュータ)を実行していますことを除いて説明するように、私はほぼ同様の構成のためのCMakelist.txtを働いてきました。

私はあなたの問題は、このラインから来ていると信じて:

find_package(OpenCV REQUIRED) 

あなたのディストリビューションのOpenCVの2.4へのアクセスを与えます。次に、手動でインストールされた3.2.xバージョンにリンクしています。したがって、使用する関数のインターフェースが2つのバージョン間で変更されるとすぐに問題が発生します。あなたの最初のコードが偶然実行されると思います。ここで

は私CMakeList.txtです:

cmake_minimum_required(VERSION 2.8) 
project(demo) 

find_package(OpenCV 3.2 REQUIRED PATHS "/path/to/OCV3.2/install/dir/") 

include_directories(${OpenCV_INCLUDE_DIRS}) 
add_executable(main main.cpp) 
target_link_libraries(main ${OpenCV_LIBS}) 

あなたのリポジトリにOpenCVの3.2をインストールするには、ハードコードされたパスをコミットしたくない場合は、にfind_packageラインを変更することで、このCMakeList.txtを絞り込むことができます。

if(DEFINED ENV{OPENCV_INSTALL_DIR}) 
    find_package(OpenCV 3.2 REQUIRED PATHS $ENV{OPENCV_INSTALL_DIR}) 
else() 
    message("OPENCV_INSTALL_DIR not set, searching in default location(s)") 
    find_package(OpenCV 3.2 REQUIRED) 
endif(DEFINED ENV{OPENCV_INSTALL_DIR}) 

次に、cmakeを実行する前に、変数OPENCV_INSTALL_DIRを定義するだけで済みます。 .bashrc

+0

それは働いた!本当にありがとう! –

1

実際、OpenCVのシステムデフォルトバージョンとリンクしています。

OpenCVConfig.cmakeファイルへの正しいパスでCMakeを呼び出すことによって、プロジェクトを再構成します。

cmake /path/to/your/sources -DOpenCV_DIR=/home/ubuntu/opencv-3.2.0

ビルドディレクトリ内のファイルCMakeCache.txtを検索します。内部CMake変数を含み、OpenCVパスもそこにあります。

また、パスをハードコードするのは間違いです。あなたが新しくインストールされたOpenCVのヘッダを使用するために、インクルードファイルを設定している間OpenCVConfig.cmake

- OpenCV_LIB_DIR     : The directory(es) where lib files are. Calling LINK_DIRECTORIES 
            with this path is NOT needed. 
+0

実行時エラーが発生していません。リンク中です。彼が使用しているCMakeコマンドは、間違ったバージョンのライブラリとリンクするように指示しています。 – jhauris

+0

@ jhauris、はい、そうです、それを指摘していただきありがとうございます。 – wl2776

+0

@ wl2776 'cmake .. -DOpenCV_DIR =/home/ubuntu/opencv-3.2.0'の' make'を実行しましたが、定義されていない参照エラーがまだ残っています。また、もともと私は 'include_directories($ {OPENCV_INCLUDE_DIRS})'を使っていましたが、印刷バージョンコードを実行したときに 'OpenCV version:2.4.13'と表示されていたので、今使っているものに切り替えました。 –

1

からinclude_directories(${OPENCV_INCLUDE_DIRS})

と引用を使用して、あなたのシステムパス上のOpenCVにリンクされています。バージョンはヘッダーに格納されているだけなので、期待されるバージョンを出力していますが、リンクできません。変数 "OpenCV_DIR"を、findモジュールを実行する前に使用するOpenCVConfig.cmakeファイルの場所に設定してみてください。

ご使用のバージョンのcmake hereのマニュアルを参照してください。 find_packageが実行可能な2つのモード(ModuleまたはConfigモード)に注意してください。

静的ライブラリにリンクしている場合を除き、ライブラリ/アプリケーションの実行には問題はあります。これを修正するには、LD_LIBRARY_PATHにライブラリを追加する必要があります。

関連する問題