ximeaのnot found errorについて

konnyaku

事の発端

カメラを接続してもプログラム上では反応しない!!! どうして!!!

みたいな感じです。

  • mac
  • 公式から softwareupdate して、表記に従って環境設定はした

解決策

アプリケーションを起動している時にはプログラムではカメラは反応しない!!! アプリケーションを終了してからプログラムを実行すればカメラをちゃんと見つけてくれる。

色々調べたけど見つからない時は人に聞くのが一番ですね

以下調べた時にやったこと。全て徒労。

状況

shell
>>> make GST10=1
c++ streamViewer.o getnsview.o -Wl,-headerpad_max_install_names -mmacosx-version-min=10.7 -o streamViewer `pkg-config --libs gtk+-2.0 gstreamer-app-1.0 gstreamer-video-1.0` -F../../bin/OSX -framework m3api
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
ld: warning: directory not found for option '-F../../bin/OSX'
ld: framework not found m3api
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [streamViewer] Error 1

予想:フレームワークのインストール先の違い

software pacage に入っている Install を起動した時に ximea のための framework である m3api.framework を 入れているが、 Installing m3api framework to /Library/Frameworks という表記の通り/Library/Frameworksに入っている。 しかし実際には/System/Library/Frameworksを探している。

詳しくはInstalling Your Frameworkに書いてそう

ここでの説明では/Library/Frameworksの次に/System/Library/Frameworksを探すそうだ。 /Library/Frameworksには確かにm3api.framworkが存在するが、not foundになるのはなぜだろう。

もう少し詳しく調べてみるとIncluding Frameworksに次のようなことが書いてある。

Note: If you are not using Xcode to build your project, you must use the -framework option of GCC and ld to build and link against the specified framework. See the gcc and ld man pages for more information.

-frameworkを使う場合は Xcode を使うわけではないので、gcc か ld のページを参考にするべきだという話なので見てみる。とりあえず link とやらができてなさそう。リンクってなんぞや。

(参考)

C/C++のビルドの仕組みとライブラリ

ライブラリのリンク方法をきっちり区別しよう

  • c/c++でライブラリを使う時は静的ライブラリと動的ライブラリと動的読み込みがある
  • 静的ライブラリを使う時はヘッダファイル静的リンクライブラリファイルが必要
  • *.a や*.lib(windows) は静的リンクライブラリファイル
  • *.dylib(so)は動的リンク、*.bundle(so)は動的読み込み(Mac)
gcc main.c -I <mylib.hがあるディレクトリへのパス> -L <libmylib.aがあるディレクトリへのパス> -l mylib
  • -Iではヘッダファイルパス、-Lでは静的リンクライブラリパス、-lではライブラリの名前を入力する。

これを参考に-frameworkを使わずに include してみる。

m3api.framework の中身を調べるとちゃんと Headers と Libraries というフォルダが存在する!!

けどだめでした。-Lがオプションとして認識されていない。というか中身も dylib で動的リンク。

dylib は動的リンクなので-lだけで良さそう。

だめだった。

解決策

-Fで m3api が存在する/Library/Frameworksを指定したら error がなくなった!!!

-Fで framework の検索パスを追加できるみたい。

(参考)How to change framework search paths?

だけど新しいエラーがでた

ld: library not found for -lstdc++

なにこれ。

新しいエラーに対して

shell
>>> mdfind stdc++ | grep stdc++
/usr/local/Cellar/gcc/10.2.0_4/include/c++/10.2.0/x86_64-apple-darwin20/bits/stdc++.h

存在はする。

~/.zshrc
export LIBRARY_PATH=/usr/local/Cellar/gcc/10.2.0_4/include/c++/10.2.0/x86_64-apple-darwin20/bits/

という感じで無理矢理通そうと思ってやったけどだめだった。 これヘッダファイルだから-Iでやるべきかも。 とおもったやったけどだめだった。/usr/local/include にコピーもしたけどだめだった。