>

2013年11月23日土曜日

XcodeでビルドしたOpenCVを参照するC++コードのビルド時のUndefined symbols for architecture x86_64

MacでOpenCVをビルドし、そのビルドしたライブラリを使用した自分のコードをビルドするときにリンカエラーが出て次のように表示される問題について。

Undefined symbols for architecture x86_64:

※ちなみに環境はOS X 10.9, Xcode 5.0, OpenCV 3.0.0-dev, CPU:2.5 GHz Intel Core i5(64bit), 開発言語はC++

実際にはOpenCVのdylibのパスも通っているし、そのdylibにはx86_64用にビルドした使用関数が含まれているにも関わらず、その関数が見つからないというエラーで結構はまったのでメモ。

まず前提として次のことは確認済みとする。
1)OpenCVのビルドをちゃんとx86_64で行っていることを再確認。(下図参照)
2)ビルドしたいOpenCVを使用しているプロジェクトのライブラリ参照パスOpenCVのdylibのディレクトリ(通常は/usr/local/lib)にOpenCVのdylibが通っていることを再確認。


以上がちゃんと出来ているのも関わらず冒頭のリンクエラーが出る場合はライブラリの設定を疑う。

・解決方法(コンパイラの設定)
XcodeのOpenCVプロジェクトのBuild SettingsのApple LLVM 5.0 - Language - C++のC++ Standard Libraryの設定をlibstdc++ (GNU C++ standard library)に変更して、OpenCVをリビルドして再インストール。OpenCVを参照しているコードを管理しているプロジェクトの設定も同様に変更して、ビルドする。すると、ちゃんとdylibの関数を見つけられるようになり、ビルドできるようになる。


補足
・XcodeでのOpenCVのビルドはhttp://blog.ra-labo.com/2011/01/opencv-macos-3c.htmlが参考になった。
・この記事ではアーキテクチャはx86_64に設定されていることを前提としているがUniversal(32/64-bit Intel(i386, x86_64))とかでもOpenCVのビルド設定と、OpenCV参照プログラムのビルド設定が一致していれば問題ないとは思う。
・なんでLLVMの設定でうまく行くようになったのかはネットの断片的な情報で関係ありそうなのをひたすら試してみただけなので詳しくは分からない。とりあえず、今は続きの実装したいのでスルーする。知ってる人いたら教えて。

最後に宣伝

自作でAndroidアプリを作ったので宣伝させてください。お子さんにAndroidのスマホやタブレットを渡している方におススメのアプリです。スマホやタブレットで遊ぶことをご褒美に勉強をさせることができるアプリです。子供が勝手に勉強するようになります。

2013年11月19日火曜日

ためになった記事のリンク集

gitからダウンロードしたopencv(3.0)の最新版をmac(Mac OS X)でビルド
http://blog.ra-labo.com/2011/01/opencv-macos-3c.html


2013年11月14日木曜日

VMWareの仮想Windowsで開発していてMSVCR90D.dllが見つからないと言われる件

VMWareの仮想Windows上でVisualStudioのプロジェクトを実行すると

「MSVCR90D.dllが見つからなかったため、このアプリケーションを開始できませんでした。
アプリケーションをインストールし直すとこの問題は解決される場合があります。」

のようなことを言われることがある。

プロジェクトファイルがVMWareの(Macとの)共有フォルダにあることが原因と考えられる。※その場合はプロジェクトファイルをフォルダごとごっそり共有フォルダではないフォルダに移動してからプロジェクトを再度開き、リビルドしてから実行すると解決する。

※VMWareをインストールするとデフォルトでドキュメントやピクチャ、デスクトップなど主要なフォルダが親Macと仮想Windowsで共有される設定になっていることがある。

お困りの方は試してみてください。