Jetsonとopencvでエラー発生
散見されるJetson×opencv問題
Jetsonを使っている方々に少しでもためになればと思い書きました.
nvidia jetsonシリーズで,既存ライブラリをCMakeなどでビルドしたときにこんなエラーが出たことはないでしょうか?
fatal error: opencv2/core/core.hpp: No such file or directory
#include <opencv2/core/core.hpp>
opencv2/core/core.hppと同様に,opencv2のincludeパスが見つからないというエラーが出たときはこちらの記事で解決できます.
includeパスでエラーが出ているようなので/usr/includeの中身を見てみると...
opencv2という名前のフォルダがなく変わりにopencvという名前のフォルダがありました
なぜだnvidiaさん...
更にls
コマンドで調べてみると...
opencvという名前のフォルダが
/usr/include/opencv4/opencv2フォルダのシンボリックリンクになっているようです.
ls -l /usr/include
# 以下結果
lrwxrwxrwx 1 root root 29 1月 9 16:44 opencv -> /usr/include/opencv4/opencv2/
つまりなぜエラーが出ているかというと...
opencvのもともとのincludeパスは opencv2/... (例 opencv2/core/core.hpp) なはずなのに,jetsonのデフォルトではinclude直下のシンボリックリンクのフォルダ名が opencv となっていて,デフォルトのままではincludeパスを /opencv/... (例 opencv/core/core.hpp)にしないとbuildできない
って感じです
そこはopencv2にしといてくださいって感じですホント
シンボリックリンクのお話はこちらがわかりやすいかと思います
https://qiita.com/go_astrayer/items/ab993cdc420d4f7f50d4
解決策
ファイルのインクルードパスを変えるのはさすがにきつすぎる...
ということで
opencvフォルダと同様に,opencv2という名前で/usr/incude/opencv4/opencv2のシンボリックリンクを作成します.
cd /usr/include
sudo ln -s /usr/include/opencv4/opencv2 opencv2
作成後,opencv2のフォルダが作成されてそこから/usr/incude/opencv4/opencv2に飛ぶことができます
実行後のusr/includeフォルダはこんな感じ
opencv2に入ると中身は/usr/incude/opencv4/opencv2と一緒です
これでビルドしてもエラーが出なくなりました!!