Caffe Windows Build Fails with BUILD_MATLAB=1 with LNK2001 Linker Errors

56 views
Skip to first unread message

Richard Sating

unread,
May 23, 2019, 4:52:34 AM5/23/19
to Caffe Users
Pulled code from:

Following build instructions, the following command was run in Windows 10 from the VS2017 Native Tools Command Prompt:

   C:\Users\M4800\Documents\caffe_bvlc_vs2017p>scripts\build_win.cmd

The build was fully successful with BUILD_MATLAB=0.

When we set BUILD_MATLAB=1 at top of build_win.cmd we get linker errors in the "matlab" project such that caffe_.mexw64 is never built.

I noticed the following in the CMAKE compiler output that something was wrong with the Matlab result:

-- Matlab:
--   Matlab            :   Yes (,   <=== this did not look right!
--   Octave            :   No

This output was from the folling lines in Summary.cmake

    caffe_status("Matlab:")
    caffe_status("  Matlab            :" HAVE_MATLAB THEN "Yes (${Matlab_mex}, ${Matlab_mexext}" ELSE "No")
    caffe_status("  Octave            :" Octave_compiler THEN  "Yes (${Octave_compiler})" ELSE "No")

The output suggested ${Matlab_mex} and ${Matlab_mexext} were both empty, so I did "printf" debugging of the CMAKE scripts.

Determining that FindMatlabMex.cmake never ran, the following code that initialized the above symbols was copied and pasted into Dependencies.cmake

  if(MSVC)
    foreach(__ver "9.6" "9.3" "9.1" "7.14" "7.11" "7.10" "7.9" "7.8" "7.7")
      get_filename_component(__matlab_root "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB\\${__ver};MATLABROOT]" ABSOLUTE)
      if(__matlab_root)
        break()
      endif()
    endforeach()
  endif()

  find_path(Matlab_DIR NAMES bin/mex.bat bin/mexext.bat PATHS ${__matlab_root}
                       DOC "Matlab directory" NO_DEFAULT_PATH)

  find_program(Matlab_mex    NAMES mex    mex.bat    HINTS ${Matlab_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH)
  find_program(Matlab_mexext NAMES mexext mexext.bat HINTS ${Matlab_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH)

The above resolved the empty symbol problem, confirmed by CMAKE output:

-- Matlab:
--   Matlab            :   Yes (C:/Program Files/MATLAB/R2019a/bin/mex.bat, C:/Program Files/MATLAB/R2019a/bin/mexext.bat
--   Octave            :   No

Note this was after editing the CNAKE code to allow for Matlab version 9.6 for R2019a, which I have installed.

Remaining is a linker error:

  1>LINK : error LNK2001: unresolved external symbol mexCreateMexFunction
  1>LINK : error LNK2001: unresolved external symbol mexDestroyMexFunction
  1>LINK : error LNK2001: unresolved external symbol mexFunctionAdapter
  1>C:/Users/M4800/Documents/caffe_bvlc_vs2017p/build/matlab/Release/caffe_.lib : fatal error LNK1120: 3   unresolved externals

Opening the project file generated by CMAKE in VS2017: 

  C:\Users\M4800\Documents\caffe_bvlc_vs2017p\build\Caffe.sln

Below are properties of interest from the "matlab" project in the solution that fails to link.

Configuration Properties --> VC++ Directories --> Library Directories
  $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;$(MatlabDir)\extern\lib\win64\microsoft;

Configuration Properties --> C/C++ --> Additional Include Directores
C:\Users\M4800\Documents\caffe_bvlc_vs2017p\build\include;
C:\Users\M4800\Documents\caffe_bvlc_vs2017p\build;
C:\Program Files\MATLAB\R2019a\extern\include;C:\local\boost_1_65_1;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include;
C:\Users\M4800\Documents\caffe_bvlc_vs2017p\include;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\include;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\include\opencv;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\Include;%(AdditionalIncludeDirectories)
C:\Program Files\MATLAB\R2019a\extern\lib\win64\microsoft\libMatlabEngine.lib;
C:\Program Files\MATLAB\R2019a\extern\lib\win64\microsoft\libMatlabDataArray.lib;
C:\Program Files\MATLAB\R2019a\extern\lib\win64\microsoft\libmex.lib;
C:\Program Files\MATLAB\R2019a\extern\lib\win64\microsoft\libmx.lib;
C:\Program Files\MATLAB\R2019a\extern\lib\win64\microsoft\libmat.lib;
..\lib\Release\caffe.lib;..\lib\Release\caffeproto.lib;
C:\local\boost_1_65_1\lib64-msvc-14.0\boost_system-vc140-mt-1_65_1.lib;
C:\local\boost_1_65_1\lib64-msvc-14.0\boost_thread-vc140-mt-1_65_1.lib;
C:\local\boost_1_65_1\lib64-msvc-14.0\boost_filesystem-vc140-mt-1_65_1.lib;
C:\local\boost_1_65_1\lib64-msvc-14.0\boost_chrono-vc140-mt-1_65_1.lib;
C:\local\boost_1_65_1\lib64-msvc-14.0\boost_date_time-vc140-mt-1_65_1.lib;
C:\local\boost_1_65_1\lib64-msvc-14.0\boost_atomic-vc140-mt-1_65_1.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\glog.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\Lib\gflags.lib;
shlwapi.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\libprotobuf.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\caffehdf5_hl.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\caffehdf5.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\cmake\..\lib\caffezlib.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\lmdb.lib;ntdll.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\leveldb.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\cmake\..\lib\boost_date_time-vc140-mt-1_61.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\cmake\..\lib\boost_filesystem-vc140-mt-1_61.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\cmake\..\lib\boost_system-vc140-mt-1_61.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\snappy_static.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\caffezlib.lib;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cudart.lib;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\curand.lib;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cublas.lib;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cublas_device.lib;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cudnn.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\x64\vc14\lib\opencv_highgui310.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\x64\vc14\lib\opencv_imgcodecs310.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\x64\vc14\lib\opencv_imgproc310.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\x64\vc14\lib\opencv_core310.lib;
C:\Users\M4800\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib\libopenblas.dll.a;
C:\Users\M4800\Miniconda2\libs\python27.lib;C:\local\boost_1_65_1\lib64-msvc-14.0\boost_python-vc140-mt-1_65_1.lib;
kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib

Any suggestions that could help resolve the linker errors?

Reply all
Reply to author
Forward
0 new messages