stMind

about Tech, Computer vision and Machine learning

コンパイルエラーで個人的にわりとよく使うコマンド

OSX El Capitan 10.11.6です。

locate, export

例えば、とあるmakeを実行したらwchar.hが見つからないと言われました。

$ make
g++ libRegionBPP/libRegionBPP.cpp -c -std=c++98 -pedantic -W -Wall -fopenmp -O3 -fPIC
In file included from /usr/local/Cellar/gcc@4.9/4.9.3/include/c++/4.9.3/bits/postypes.h:40:0,
                 from /usr/local/Cellar/gcc@4.9/4.9.3/include/c++/4.9.3/iosfwd:40,
                 from /usr/local/Cellar/gcc@4.9/4.9.3/include/c++/4.9.3/ios:38,
                 from /usr/local/Cellar/gcc@4.9/4.9.3/include/c++/4.9.3/ostream:38,
                 from /usr/local/Cellar/gcc@4.9/4.9.3/include/c++/4.9.3/iostream:39,
                 from libRegionBPP/libRegionBPP.cpp:29:
/usr/local/Cellar/gcc@4.9/4.9.3/include/c++/4.9.3/cwchar:44:19: fatal error: wchar.h: No such file or directory
 #include <wchar.h>
                   ^
compilation terminated.
make: *** [libRegionBPP.a] Error 1

インクルードディレクトリにパスが通ってないのでしょう。まずは、wchar.hの場所を探して、そこにパスを通すことにします。

$ locate wchar.h
...
/usr/include/wchar.h
...
$ export CPATH=$CPATH:/usr/include

設定出来たらもう一度makeです。

$ make
g++ libRegionBPP/libRegionBPP.cpp -c -std=c++98 -pedantic -W -Wall -fopenmp -O3 -fPIC
In file included from /usr/include/string.h:176:0,
                 from libRegionBPP/libRegionBPP.cpp:34:
...
/var/folders/bq/xh66g4d17rn1xkjsmj4md4qm0000gn/T//cczqQzWW.s:3576:11: note: change section name to "__const"
        .section __DATA,__const_coal,coalesced
                 ^      ~~~~~~~~~~~~
ld: library not found for -lSystem
collect2: error: ld returned 1 exit status
make: *** [prog_dSP] Error 1

locate, export, ln

ライブラリが見つからないのだが、これもライブラリディレクトリにパスが通ってないのでしょう。

$ locate libSystem.dylib
...
/usr/lib/libSystem.dylib
$ export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib

再度makeしてみるも同じエラーになって、/usr/local/libも加えたりしてみたものの解消せず。根本的な解決になってないのだけど、makeファイルの中でカレントディレクトリが動的ライブラリの検索パスになっているので、シンボリックリンクをカレントディレクトリに作成することに。

$ ln -s /usr/lib/libSystem.dylib libSystem.dylib

otool

まだまだmakeは続く。で、ここでは、これもよくみるSymbol not found

$ make
...
/Applications/MATLAB_R2015a.app/bin/mex -v -cxx CC='g++' CXX='g++' LD='g++' -output structuredPrediction structuredPrediction.o -L. -lSPRegion -lDH -lRegionBPP -lgomp
dyld: Symbol not found: __ZN5boost13log2_mt_posix10basic_coreIcE11open_recordERKNS0_19basic_attribute_setIcEE
  Referenced from: /Applications/MATLAB_R2015a.app/bin/maci64/libmwfl.dylib
  Expected in: /usr/local/lib/libboost_log.dylib
 in /Applications/MATLAB_R2015a.app/bin/maci64/libmwfl.dylib
/Applications/MATLAB_R2015a.app/bin/mex: line 365: 87163 Trace/BPT trap: 5       $MATLAB/bin/maci64/mex $args
make: *** [structuredPrediction.mexa64] Error 133

otoolでlibmwfl.dylibの依存関係を調べて、

$ otool -L /Applications/MATLAB_R2015a.app/bin/maci64/libmwfl.dylib 
/Applications/MATLAB_R2015a.app/bin/maci64/libmwfl.dylib:
    @rpath/libmwfl.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    @rpath/libmwresource_core.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libmwi18n.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libmwMATLAB_res.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_date_time.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_filesystem.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_log.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_regex.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_serialization.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_signals.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libboost_thread.dylib (compatibility version 0.0.0, current version 0.0.0)
    @rpath/libtbb.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

rpathになってて、どこのライブラリがリンクされてるかはわからなかったけど、よくよくエラーを見てみると、/Applications/MATLAB_R2015a.app/bin/maci64/libmwfl.dylibなのに、/usr/local/lib/libboost_log.dylibが使われているから?locateでlibboost_log.dylibの場所を探す。

$ locate libboost_log.dylib
/Applications/MATLAB_R2015a.app/bin/maci64/libboost_log.dylib
/usr/local/Cellar/boost/1.57.0/lib/libboost_log.dylib
/usr/local/Cellar/boost/1.59.0/lib/libboost_log.dylib
/usr/local/Cellar/boost/1.64.0_1/lib/libboost_log.dylib
/usr/local/lib/libboost_log.dylib

そういえば、/usr/local/libをLD_LIBRARY_PATHに設定してしまってたな。/usr/local/libは外して、makeするとようやくコンパイル出来た。

まとめ

これだけでは解決しないことも多いけど、locate, export, ln, otoolくらいで出来る場合も多い印象です。