状況
Homebrew経由でインストールした OpenCVをゴリゴリ使って書いたプログラムを、せっかくだしGUI化しようと思いQtをダウンロード。 Qt Creatorを立ちあげ、Qt-Test.pro
を書いていざRun
!ってところで次のような実行時エラーが発生しました。
dyld: Symbol not found: __cg_jpeg_resync_to_restart
Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Expected in: /usr/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
プログラムが突然終了しました。
環境
- MacOSX El Capitan 10.11.2
- Qt 5.5.1
- Qt Creator 3.6.0(Clang6.1 64ビット)
- Homebrew 0.9.5
Qt-Test.pro
ファイルは次のような感じです。
TEMPLATE = app
TARGET = Qt-Test
INCLUDEPATH += .
INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/lib -lopencv_highgui -lopencv_core -lopencv_imgproc
HEADERS += mainwindow.h
FORMS += mainwindow.ui
SOURCES += main.cpp mainwindow.cpp
対処法1(しかし未解決)
エラーで検索をかけると、こちらのサイトを発見。どうも Homebrewで入れたlibJPEG.dylib
には__cg_jpeg_resync_to_restart
という関数が定義されていないらしい。 そもそもなんでこれインストールしたっけな
ならばこいつをアンインストールしようとbrew uninstall jpeg
(もしくはbrew uninstall libjpeg
)を実行し、もう一度Run
するも今度は次のようなエラーが・・・
dyld: Library not loaded: /usr/local/lib/libjpeg.8.dylib
Referenced from: /usr/local/lib/libTIFF.dylib
Reason: image not found
プログラムが突然終了しました。
そりゃ見つからないよね…
対処法2
本来ならば/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylyb
をロードすべきところをQt-Test.pro
に書いたLIBS += -L/usr/local/lib
のせいでこちらのディレクトリを先に走査してしまい、 Homebrew経由でインストールしたlibJPEG.dylib
をロードしてしまっているのがそもそもの問題なので、libJEPG.dylyb
等は純正(?)のものを使用できるようにしたい。
そこで、 Homebrew経由でインストールしたライブラリ等へのシンボリックリンクが一括して格納されてある/usr/local/lib
ではなく、生のディレクトリを読みに行くようにQt-Test.pro
を書き換えることにしました。下記のLIBS += -L/usr/local/Cellar/opencv/2.4.12/lib
がそれに該当します。
TEMPLATE = app
TARGET = Qt-Test
INCLUDEPATH += .
INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/Cellar/opencv/2.4.12/lib -lopencv_highgui -lopencv_core -lopencv_imgproc
HEADERS += mainwindow.h
FORMS += mainwindow.ui
SOURCES += main.cpp mainwindow.cpp
これで初めのエラーはなくなり、無事、Run
できました。
結論
Qt で Homebrew経由でインストールしたライブラリ等を使用する際は、.pro
ファイルには/usr/loca/lib
でなく各ライブラリが格納されている生のディレクトリをLIBS
に与えた方がいい(かもしれない)。