質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

2765閲覧

Opencvを使ったソースコードのg++を実行したい

I_am_

総合スコア23

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/12/14 05:04

編集2020/12/14 05:46

前提・実現したいこと

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つあるのですが、なんの違いなんでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/12/14 05:26

> フルパスを指定する必要があるということですか?? ライブラリファイルが置いてある場所を -L オプションで教えたら、見つかります といっても、 > これらのライブラリファイルを探したのですが、どこにあるかがわかりません だと、指定できませんよね > dockerイメージを作る際にopencvのビルドは完了しています の結果できたライブラリファイルを置いてる場所なのですが ファイル名は、たとえば opencv_core なら libopencv_core.so みたいなのが付いたやつです ヘッダファイルが置いてあるところの近くにありそうですが、ありませんか? > その場所-I/root/tmp/opencv-3.4.4/include/opencv2を入れました
I_am_

2020/12/14 05:37

返信ありがとうございます。 これらの情報を元に調べて追記しました。
jbpb0

2020/12/14 06:00

-l の指定のやり方は、元々の通りで合ってます ファイル名の最初の lib や、後ろの .so* は、付けません
I_am_

2020/12/14 06:49

情報提供ありがとうございます。 ライブラリと共有ライブラリの違いについて理解を深められました。
guest

回答1

0

自己解決

gcc main.c -I <mylib.hがあるディレクトリへのパス> -L <libmylib.aがあるディレクトリへのパス> -l mylib

でコンパイルできました。

jbpb0さんの情報提供
https://www.glamenv-septzen.net/nifty/others/computer/linux_ldd01.html
ありがとうございました。
この資料により、細かい共有ファイルやライブラリの認識を深めることができました。

投稿2020/12/14 06:47

I_am_

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問