状況
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に与えた方がいい(かもしれない)。