実現したいこと
MacBook Air(M1, 2020)上でC++を実行する上で、OpenCVのインクルードエラーを解決したい
発生している問題・分からないこと
#include <opencv2/opencv.hpp>のように、opencvをインクルードしたところ、
- #include エラーが検出されました。includePath を更新してください。
- ソース ファイルを開けません "ruby/internal/assume.h" (dependency of "opencv2/opencv.hpp")C/C++(1696)
- 'opencv2/opencv.hpp' file not found gcc
という3つのエラーが発生しているが、opencvは規定のディレクトリにあるにも関わらず、エラーが消えない。
該当のソースコード
C++
1#include <opencv2/opencv.hpp> 2 3int main() { 4 cv::Mat img = cv::imread("sample.jpg"); 5 6 cv::imshow("img", img); 7 8 cv::waitKey(0); 9 10 return 0; 11}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Googleを調べたところ、C++の実行方法として、CMakeLists.txtというものを作り、実行したいファイルがあるディレクトリ上で
- mkdir build && cd build
- cmake .. && make
- ./main
とターミナル上でコマンドを打てば、実行できることを知り、やってみたところ、実行できた。しかし、本当は、VSCode上の矢印の「C/C++ファイルの実行」やターミナル上で
g++ main.cpp –o main pkg-config --libs opencv --cflags opencv4
というようなコマンドを使い、実行したかった。インクルードエラーが解決していないため、実行することができない。
補足
使っているIDE:Visual Studio Code
PC:MacBook Air(M1, 2020)
#includeはそのままで、mainの中味を return 0; の1行のみにするとエラーメッセージはどうなりますか?
あと、pkg-config --libs opencv --cflags opencv4 の出力結果はどんなものでしょうか?
mainの中身をreturn 0:のみにしましたが、やはり同じエラーが出ました。
pkg-config --libs opencv --cflags opencv4 の出力結果は、
(base) (ユーザー名)@MacBook-Air opencv % pkg-config --libs opencv --cflags opencv4
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
でした。
> やはり同じエラーが出ました。
実際のエラーメッセージ全文を掲載しましょう。
> pkg-config --libs opencv --cflags opencv4 の出力結果は、
やはりPATHが通ってないと言うことですね。
you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
という指示に従いましょう。
>実際のエラーメッセージ全文を掲載しましょう。
・#include エラーが検出されました。includePath を更新してください。
・'opencv2/opencv.hpp' file not found gcc
というエラーでした。
>you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variable という指示に従いましょう。
そもそも、opencv.pcというファイルがないのですが、どうするべきでしょうか?
> そもそも、opencv.pcというファイルがないのですが、どうするべきでしょうか?
そりゃ作るのでしょう。「このファイルに書け」という指示のファイルが今なければ作るという選択肢以外無いと思いますけど??作る場所を間違えないように。
opencvは使ったことないですが、検索するといくらでも情報がありますね。
最終的には、g++ のコマンドラインの -I オプションや -L -l オプションにどのディレクトリーやファイルを与えるかということになるので、それらを把握しているのなら、pkg-configに頼らず自分で明示的に与えても良いと思いますが。
おそらく brew を通して opencv をインストールした過程で pkg-config もインストールされていると思われますが、 `pkg-config --libs --cflags opencv4` が適切なフラグを返すならば正常に動作すると思います
pkg-config が認識しているパッケージは `pkg-config --list-all` で表示でき、 opencv 関連のものを探すならば `pkg-config --list-all | grep opencv` とすると良いでしょう
現在のところ brew や apt で提供されている opencv 4.x のパッケージは opencv.pc を提供しておらず、opencv4.pc が提供されているならば必要ないと思われます
brewでopencvとpkg-configを再インストールしたところ、pkg-config --libs --cflags opencv4 の出力は、以下の通りになりました。
(base) (ユーザー名)@MacBook-Air ~ % pkg-config --libs --cflags opencv4
-I/opt/homebrew/opt/opencv/include/opencv4 -L/opt/homebrew/opt/opencv/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
この通りですが、このような出力で合っていますでしょうか? また、再インストールしたところ、opencv4.pcが/opt/homebrew/Cellar/opencv/4.9.0_12/lib/pkgconfig/opencv4.pcにダウンロードされました(なお、opencvのC++の一通りのヘッダーファイルは/opt/homebrew/Cellar/opencv/4.9.0_12/include/opencv4/opencv2にダウンロードされました)。
you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variableというエラーもあったため、"https://ja.stackoverflow.com/questions/53767/macos-c%E3%81%A7opencv%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84" のサイトに記載されていたことを参考に、~/.bash_profileにexport PKG_CONFIG_PATH="/opt/homebrew/Cellar/opencv/4.9.0_12/lib/pkgconfig/opencv4.pc"の記述を追加したのですが、それでも
(base) (ユーザー名)@MacBook-Air OpenCV % g++ affine.cpp `pkg-config --libs opencv --cflags opencv4`
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
affine.cpp:4:10: fatal error: 'opencv2/opencv.hpp' file not found
#include <opencv2/opencv.hpp>
^~~~~~~~~~~~~~~~~~~~
1 error generated.
のエラーが出ます。どう改善すれば良いでしょうか?
存在しない、必要のない opencv.pc を pkg-config が探そうとしてエラーとなっています g++ affine.cpp `pkg-config --libs --cflags opencv4` のように opencv を取り除いて実行してください
"opencv"の文言を消して実行してみました。そうすると、出力が
(base) (ユーザー名)@MacBook-Air OpenCV % g++ affine.cpp `pkg-config --libs --cflags opencv4`
In file included from affine.cpp:4:
In file included from /opt/homebrew/opt/opencv/include/opencv4/opencv2/opencv.hpp:52:
In file included from /opt/homebrew/opt/opencv/include/opencv4/opencv2/core.hpp:52:
/opt/homebrew/opt/opencv/include/opencv4/opencv2/core/cvdef.h:788:4: error: "OpenCV 4.x+ requires enabled C++11 support"
# error "OpenCV 4.x+ requires enabled C++11 support"
^
In file included from affine.cpp:4:
In file included from /opt/homebrew/opt/opencv/include/opencv4/opencv2/opencv.hpp:52:
In file included from /opt/homebrew/opt/opencv/include/opencv4/opencv2/core.hpp:53:
In file included from /opt/homebrew/opt/opencv/include/opencv4/opencv2/core/base.hpp:58:
In file included from /opt/homebrew/opt/opencv/include/opencv4/opencv2/core/cvstd.hpp:81:
/opt/homebrew/opt/opencv/include/opencv4/opencv2/core/cvstd_wrapper.hpp:40:44: warning: variadic templates are a C++11 extension [-Wc++11-extensions]
template<typename C, typename Ret, typename... Args>
^
(エラーがここに載せきれないほど発生したため、一部を記載)
fatal error: too many errors emitted, stopping now [-ferror-limit=]
41 warnings and 20 errors generated.となり、ここには載せきれないほどのエラーが発生しました。バージョンが違うということでしょうか?
gcc のバージョンが古く、デフォルトで C++11 以上が選択されていないと思われますので、g++ affine.cpp -std=c++11 `pkg-config --libs --cflags opencv4` のように -std=c++11 オプション(必要ならばより高いバージョンを指定してください)を追加する、またはより新しいコンパイラを使ってみてください
ありがとうございます。実行できるようになりました。
様々なエラーの相談に乗っていただき、ありがとうございました!
それから、ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?

回答1件
あなたの回答
tips
プレビュー