>

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の設定でうまく行くようになったのかはネットの断片的な情報で関係ありそうなのをひたすら試してみただけなので詳しくは分からない。とりあえず、今は続きの実装したいのでスルーする。知ってる人いたら教えて。

1 件のコメント:

あるたいる さんのコメント...

助かりました