不慣れなWindows上Eclipse上でのリンクエラーに関してメモを残す。
事例1:Eclipseでのディレクトリの設定で,""で囲むと逆効果の設定がある。
LNK1104: cannot open file 'C:\Program.obj'
"C:\Program Files\boost_1_58_0\stage\lib"
リンク対象が
C:\Program
になってしまって生じる。
""で囲む、囲まないを変えてみて試してみる。
事例2:_MSC_VERの値
Eclipseによる開発ではC++のコンパイラを選べる。C++のコンパイラとしてVisual Studio を使用している。Visual Studioでコンパイルしているのだから、前に「リンクエラーを生じさせる方法」で述べたように、Visual Studioのバージョンをそろえてコンパイル・リンクする必要がある。
次のリンカのエラーは、そのことに注意して対策をしていく。
: error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1800'
Visual StudioのCコンパイラを用いている場合には、Visual Studioのバージョンを常に意識する必要がある。例を挙げれば、
boost_1_58_0\stage\libの下にあるlibファイルはファイル名の一部にlibファイルを生成したコンパイラを示すvc120の記述がある。
libboost_filesystem-vc120-mt-1_58.lib
また、OpenCVの配布の中にあるprecompileのライブラリにも、VCのバージョンごとに異なったファイル構成がある。
C:\opencv_2.4.11\build\x86\vc11\lib
C:\opencv_2.4.11\build\x86\vc12\lib
「リンクエラーを生じさせる方法(Visual Studio)」
に述べた内容に加えて、Eclipseの環境設定ファイルをエディタで開いてチェックする。
.settings フォルダの中にあるprefsファイルをチェックする。
例 org.eclipse.cdt.core.prefs
INCLUDE
LIB
PATH
などの設定値が書かれているので、
意図しない版のVisual Studioとそれを利用したlibファイルを使っていないか確認していく。
Windowsのシステムの環境変数には、表示が読み取りにくいこともあって、十分にメンテナンスされておらず、古い設定が残っていたりする。
stackoverflowなどのサイトの情報を見ながら、チェックしていくこととしよう。
付記:
・言語仕様にしたがって書かれたC++のプログラムは、OSが共通であれば、使用するコンパイラやリンカに依存しないのが、期待したいところだが、実際にはそうなっていない。このことは、VisualStudioのバージョンがあがったときには、また、互換性が失われることを意味する。
・コンパイラやDebugやReleaseのモードによっては、きちんとビルドできて実行できているのに、他の条件ではビルドに成功しないことがある。
本当になぞであって、何とかしてほしいと思う。