前提・実現したいこと
Dockerを用いて環境を構築しました。
ubuntuでopenCV(c++)を使用して画像解析を行いたいです。
現状では、dockerイメージを作る際にopencvのビルドは完了しています。
しかし、
C言語の実行の仕方がいまいち理解ができていません。
発生している問題・エラーメッセージ
まずは簡単にハローワールドの生成を行いました。
コードを書いてコンパイルをしたところ以下のエラーが発生しました。
>g++ -I/root/tmp/opencv-3.4.4/include/opencv2 -L/root/tmp/opencv-3.4.4/include/opencv2 -lopencv_core -lopencv_imgproc -lopencv_imgcodecs hello.cpp /tmp/ccIM7Xf4.o: 関数 `main' 内: hello.cpp:(.text+0x149): `cv::putText(cv::_InputOutputArray const&, cv::String const&, cv::Point_<int>, int, double, cv::Scalar_<double>, int, int, bool)' に対する定義されていない参照です hello.cpp:(.text+0x1b7): `cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)' に対する定義されていない参照です /tmp/ccIM7Xf4.o: 関数 `cv::String::String(char const*)' 内: hello.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x54): `cv::String::allocate(unsigned long)' に対する定義されていない参照です /tmp/ccIM7Xf4.o: 関数 `cv::String::~String()' 内: hello.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): `cv::String::deallocate()' に対する定義されていない参照です /tmp/ccIM7Xf4.o: 関数 `cv::String::operator=(cv::String const&)' 内: hello.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): `cv::String::deallocate()' に対する定義されていない参照です /tmp/ccIM7Xf4.o: 関数 `cv::Mat::~Mat()' 内: hello.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): `cv::fastFree(void*)' に対する定義されていない参照です /tmp/ccIM7Xf4.o: 関数 `cv::Mat::create(int, int, int)' 内: hello.cpp:(.text._ZN2cv3Mat6createEiii[_ZN2cv3Mat6createEiii]+0x9d): `cv::Mat::create(int, int const*, int)' に対する定義されていない参照です /tmp/ccIM7Xf4.o: 関数 `cv::Mat::release()' 内: hello.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): `cv::Mat::deallocate()' に対する定義されていない参照です collect2: error: ld returned 1 exit status
試したこと
Opencvのヘッダーファイルを使用するので、その場所-I/root/tmp/opencv-3.4.4/include/opencv2を入れました。
opencv_core (cv::Mat など基本機能を使う際に必要)
opencv_imgproc (cv::putText など描画機能を使う際に必要)
opencv_imgcodecs (cv::imwrite など画像入出力機能を使う際に必要)
他にもこれらのライブラリファイルが必要なので、-lopencv_core -lopencv_imgproc -lopencv_imgcodecs を引数指定しました。
しかし、上記にも示したエラーが出ています。
エラーメッセージに
-lopencv_core -lopencv_imgproc -lopencv_imgcodecs
が定義されていないと出ているのですが、フルパスを指定する必要があるということですか??
”また、これらのライブラリファイルを探したのですが、どこにあるかがわかりません。”
私は、linuxの初心者なのでファイル構造や実行の内部プロセスなどが理解できていなくて、何が実行に必要なのかがいまいちピンときていないです。
結構詰まっています。
なので、何か勉強の仕方などご教授いただけないでしょうか??
ぜひ、よろしくお願いします。
### 追記
返答していただいたのでこれらの情報を元に調べてみました。
フルパスを指定する必要があるということですか??ライブラリファイルが置いてある場所を -L オプションで教えたら、見つかります
といっても、
-L/usr/local/libの中にlibopencv_core.soというのがありました。
dockerイメージを作る際にopencvのビルドは完了しています
の結果できたライブラリファイルを置いてる場所なのですが
ファイル名は、たとえば opencv_core なら libopencv_core.so みたいなのが付いたやつです
ヘッダファイルが置いてあるところの近くにありそうですが、ありませんか?
ということは、
ライブラリの名前がビルドで変更したので、その変更した後の名前で実行すればいいと考えて実行してみました。
g++ hello.cpp -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -libopencv_core.so -libopencv_imgcodecs.so -libopencv_highgui.so: そのようなファイルやディレクトリはありません
確実に、/usr/local/include/や/usr/local/libに対象ファイルが存在するのですが、”そのようなファイルやディレクトリはありません”となります。
g++が指定パスと読み込んでいないのはなぜですか??
また、
libopencv_core.so
libopencv_core.so.3.4
libopencv_core.so.3.4.4
と一つのライブラリに対して3つあるのですが、なんの違いなんでしょうか??
回答1件
あなたの回答
tips
プレビュー