MantisBT - CMake |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0015786 | CMake | Modules | public | 2015-10-13 07:32 | 2016-03-07 09:12 |
|
Reporter | Kerstin Keller | |
Assigned To | | |
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | no change required | |
Platform | Win64 | OS | Windows | OS Version | 7 |
Product Version | CMake 3.3.2 | |
Target Version | | Fixed in Version | | |
|
Summary | 0015786: FindMatlab / matlab_add_mex does not work with 64-bit Matlab Version - Version detected as 32-bit Matlab |
Description | I have installed a 64bit Matlab Version (2015a) and CMake 3.3.2.
When writing a simple CMakeLists.txt script
cmake_minimum_required(VERSION 3.3)
project(easy_example)
find_package(MATLAB REQUIRED)
include_directories(Matlab_INCLUDE_DIRS)
matlab_add_mex(
NAME easy_example
SRC easy_example.cpp
)
It cannot find the mex library. The Output is
-- Could NOT find Matlab (missing: Matlab_MEX_LIBRARY) (found version "8.5")
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
Matlab_MEX_LIBRARY
linked by target "easy_example" in directory D:/SourceCode/Matlab/easy_example
-- Configuring incomplete, errors occurred!
|
Steps To Reproduce | Try to run
find_package(MATLAB REQUIRED)
and then use
matlab_add_mex(
...
)
with a 64-bit Matlab Version. |
Additional Information | Digging a little into the FindMatlab.cmake script, and outputted the directories where it searches for the directories (l.1342).
message(STATUS "The include dir ${MATLAB_INCLUDE_DIR_TO_LOOK}")
message(STATUS "The library dir ${_matlab_lib_dir_for_search}")
This gives me the following Output
-- The include dir C:/LegacyApp/Matlab15a/R2015a_64bit/extern/include
-- The library dir C:/LegacyApp/Matlab15a/R2015a_64bit/extern/lib/win32/microsoft
However, as my Matlab Version is 64bit, it library dir should be
C:/LegacyApp/Matlab15a/R2015a_64bit/extern/lib/win64/microsoft
This can be traced back to line 1276, where I added another message Output:
if(_matlab_64Build)
set(_matlab_current_suffix ${_matlab_bin_suffix_64bits})
message(STATUS "64bit Matlab")
else()
set(_matlab_current_suffix ${_matlab_bin_suffix_32bits})
message(STATUS "32bit Matlab")
endif()
CMake falsely detects a 32bit Matlab Version
-- 32bit Matlab
|
Tags | No tags attached. |
Relationships | |
Attached Files | |
|
Issue History |
Date Modified | Username | Field | Change |
2015-10-13 07:32 | Kerstin Keller | New Issue | |
2015-10-13 07:49 | Raffi Enficiaud | Note Added: 0039583 | |
2015-10-13 07:59 | Kerstin Keller | Note Added: 0039584 | |
2015-10-13 08:04 | Raffi Enficiaud | Note Added: 0039585 | |
2015-10-13 08:12 | Kerstin Keller | Note Added: 0039586 | |
2015-10-13 08:14 | Raffi Enficiaud | Note Added: 0039587 | |
2015-10-13 08:59 | Brad King | Status | new => resolved |
2015-10-13 08:59 | Brad King | Resolution | open => no change required |
2015-10-13 09:07 | Kerstin Keller | Note Added: 0039589 | |
2015-10-13 09:09 | Kerstin Keller | Note Edited: 0039589 | bug_revision_view_page.php?bugnote_id=39589#r1930 |
2015-10-13 11:26 | Raffi Enficiaud | Note Added: 0039592 | |
2016-03-07 09:12 | Robert Maynard | Note Added: 0040614 | |
2016-03-07 09:12 | Robert Maynard | Status | resolved => closed |
Notes |
|
(0039583)
|
Raffi Enficiaud
|
2015-10-13 07:49
|
|
Hi,
It will look for the 64 bits version only if you use a 64bit toolchain. What is your initial cmake command? |
|
|
(0039584)
|
Kerstin Keller
|
2015-10-13 07:59
|
|
Ok, so this isn't really a bug, more a wrong invokation:
I invoked CMake only with
cmake . -B_build -G "Visual Studio 11 2012"
instead of
cmake . -B_build -G "Visual Studio 11 2012 Win64"
Of course a Win32 build will look for a Win32 Matlab Version. However instead of saying Could NOT find Matlab, the FindMatlab.cmake Script could be improved to give a WARNING such as "Compiling for 32bit, but only 64bit Matlab Version is installed" |
|
|
(0039585)
|
Raffi Enficiaud
|
2015-10-13 08:04
|
|
What do you see when you add "MATLAB_FIND_DEBUG" to your invocation/command line? |
|
|
(0039586)
|
Kerstin Keller
|
2015-10-13 08:12
|
|
My Output is:
-- [MATLAB] Search for Matlab from the registry unsuccessful, testing all supported versions
-- [MATLAB] Matlab root folders are 8.5;C:/LegacyApp/Matlab15a/R2015a_64bit
-- [MATLAB] Current version is 8.5 located C:/LegacyApp/Matlab15a/R2015a_64bit
-- [MATLAB] [DEBUG]_matlab_lib_prefix_for_search = lib | _matlab_lib_dir_for_search = C:/LegacyApp/M
atlab15a/R2015a_64bit/extern/lib/win32/Microsoft
So it makes sense, it was just unclear to me, why it specified the win32 as search Directory.
I think we can close the issue, as it is clearly not a bug with the Script, only wrong usage by the user. |
|
|
(0039587)
|
Raffi Enficiaud
|
2015-10-13 08:14
|
|
If you think the documentation might be improved, please indicate how you think this can be clarified.
Thanks! |
|
|
(0039589)
|
Kerstin Keller
|
2015-10-13 09:07
(edited on: 2015-10-13 09:09) |
|
Ok, so if Matlab was found (Matlab_FOUND is TRUE) but the mex library was not (Matlab_MEX_LIBRARY is NOT_FOUND), this is a strong indicator that compiler Version (32/64) and Matlab Version (32/64) are not compatible.
In the case of 32 bit compiler / 64 bit matlab the file exists at
/extern/lib/win64/Microsoft/libmex.lib,
but the search path will be
/extern/lib/win32/Microsoft/
and thus CMake cannot find the library and Matlab_MEX_LIBRARY is set to NOT_FOUND. In this case there could be a WARNING, "Matlab_MEX_LIBRARY NOT_FOUND: Please check if compiler Version and Matlab Version are compatible"
By the way, can you Point me to any example of the usage of matlab_add_mex macro, besides the official CMake documentation? I was not able to find a single example of the usage. Even though I can now find Matlab correctly, I still get linker Errors concerning used Matlab functions, see
easy_example.obj : error LNK2019: unresolved external symbol mxGetPr referenced in function "void _
_cdecl mexFunction(unsigned __int64,struct mxArray_tag * * const,unsigned __int64,struct mxArray_ta
g const * * const)" (?mexFunction@@YAX_KQEAPEAUmxArray_tag@@0QEAPEBU1@@Z) [D:\SourceCode\Matlab\eCA
LImporter\_build\easy_example.vcxproj]
easy_example.obj : error LNK2019: unresolved external symbol mxCreateStructMatrix_730 referenced in
function "void __cdecl createStructureArray(struct mxArray_tag * *)" (?createStructureArray@@YAXPE
APEAUmxArray_tag@@@Z) [D:\SourceCode\Matlab\eCALImporter\_build\easy_example.vcxproj]
D:\SourceCode\Matlab\eCALImporter\_build\Debug\easy_example.mexw64 : fatal error LNK1120: 2 unresol
ved externals [D:\SourceCode\Matlab\eCALImporter\_build\easy_example.vcxproj]
|
|
|
(0039592)
|
Raffi Enficiaud
|
2015-10-13 11:26
|
|
|
|
(0040614)
|
Robert Maynard
|
2016-03-07 09:12
|
|
Closing resolved issues that have not been updated in more than 4 months. |
|