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くらいで出来る場合も多い印象です。