Closed standarddeviant closed 7 years ago
The standard julia installer for windows should include a libjulia.dll.a
in the lib
directory.
Also, it looks like you are using MinGW to build. I have no reason to believe that using it to build mexjulia
through the mex
command (as jl.config
does) shouldn't "just work," but I also haven't tried this myself.
I was looking in the bin directory before. It is included in the lib directory. Apologies for the spam.
@twadleigh Do you typically use MSVC? If so, what version?
Ever since I put jl.config
together to make the building simpler across platforms I have primarily used MSVC to build mexjulia
. In that time I've probably used every version from 2008 to 2017 without any real issues.
By closing this issue, does this mean you got it to build successfully with MinGW? If so, great. If not, let's reopen this and see if we can at least get it to build for you.
I'll also be curious to know if you get the immediate segfaults that other windows users (#39) have reported. I myself haven't been able to duplicate it. An extra data point might at least help narrow down under what conditions it occurs.
OK, I think I know what might fix this for building with MinGW. libjulia.dll.a
is spelled out as an extra object for linking on the command line vs. what should be the normal thing (adding -ljulia
). The reason for that is that -ljulia
will cause MSVC to look for something named julia.lib
, which, of course, doesn't exist. Hence the hack. MinGW shouldn't have that problem, though.
Getting jl.config
to work with both MSVC and MinGW may now mean we have to be able to query which compiler we are using. Which means more hackery and special casing. sigh (Using the mex
command to build was supposed to make things simpler. :cry: )
It might also be sufficient to list the full path to libjulia.dll.a
when attempting to do the link. That would avoid special case hackery if it works.
Your last suggestion is very reasonable - and it worked! I have a few matlab versions on different computers. I'll report back if using the libjulia.dll.a fullpath doesn't work, but I'm closing the issue for now.
I don't have an affinity for MinGW, but it is the "free and click these buttons to get a C/C++ compiler" for matlab since 2016 or so.
Full output below (different machine than above), Win10, x86-64, Matlab 2016b (64bit):
>> mex -v -largeArrayDims -L"C:\Users\stddev\AppData\Local\Julia-0.6.0\bin\..\lib" -outdir "C:\Users\stddev\src\mexjulia" -O -I"C:\Users\stddev\AppData\Local\Julia-0.6.0\include\julia" -DJULIA_ENABLE_THREADING C:\Users\stddev\src\mexjulia\mexjulia.cpp C:\Users\stddev\AppData\Local\Julia-0.6.0\lib\libjulia.dll.a
Verbose mode is on.
... Looking for compiler 'MinGW64 Compiler (C++)' ...
... Looking for environment variable 'MW_MINGW64_LOC' ...Yes ('C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset').
... Looking for file 'C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++.exe' ...Yes.
... Looking for folder 'C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset' ...Yes.
Found installed compiler 'MinGW64 Compiler (C++)'.
Set PATH = C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin;C:\Program Files\MATLAB\R2016b\extern\include\win64;C:\Program Files\MATLAB\R2016b\extern\include;C:\Program Files\MATLAB\R2016b\simulink\include;C:\Program Files\MATLAB\R2016b\lib\win64;C:\MinGW\bin;C:\Program Files\Docker\Docker\Resources\bin;C:\Anaconda3\Scripts;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\System32;C:\Users\stddev\Downloads\ffmpeg-20170116-e664730-win64-static\bin;C:\Program Files (x86)\Gow\bin;C:\Anaconda3;C:\Program Files\Git\bin;C:\Program Files (x86)\Java\jre1.8.0_101\bin;C:\Program Files (x86)\SSH Communications Security\SSH Secure Shell;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\sox-14-4-2;C:\Users\stddev\.babun;C:\Users\stddev\AppData\Local\Julia-0.5.0\bin;C:\Users\stddev\AppData\Local\Microsoft\WindowsApps;C:\Users\stddev\AppData\Local\atom\bin;C:\Program Files (x86)\Meld
Set INCLUDE = C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\include;C:\MinGW\include;
Set LIB = C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\lib;;C:\MinGW\lib;;
Set MW_TARGET_ARCH = win64;win64;
Set LIBPATH = C:\Program Files\MATLAB\R2016b\extern\lib\win64;C:\Program Files\MATLAB\R2016b\extern\lib\win64;
Options file details
-------------------------------------------------------------------
Compiler location: C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset
Options file: C:\Users\stddev\AppData\Roaming\MathWorks\MATLAB\R2016b\mex_C++_win64.xml
CMDLINE2 : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++ -m64 -Wl,--no-undefined -shared -s -Wl,"C:\Program Files\MATLAB\R2016b/extern/lib/win64/mingw64/exportsmexfileversion.def" C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.obj C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\cpp_mexapi_version.obj C:\Users\stddev\AppData\Local\Julia-0.6.0\lib\libjulia.dll.a -LC:\Users\stddev\AppData\Local\Julia-0.6.0\bin\..\lib -L"C:\Program Files\MATLAB\R2016b\extern\lib\win64\mingw64" -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas -o C:\Users\stddev\src\mexjulia\mexjulia.mexw64
CXX : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++
COMPILER : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++
DEFINES : -DJULIA_ENABLE_THREADING -m64 -DMATLAB_MEX_FILE
MATLABMEX : -DMATLAB_MEX_FILE
CXXFLAGS : -fexceptions -fno-omit-frame-pointer -std=c++11
INCLUDE : -I"C:\Users\stddev\AppData\Local\Julia-0.6.0\include\julia" -I"C:\Program Files\MATLAB\R2016b/extern/include" -I"C:\Program Files\MATLAB\R2016b/simulink/include"
CXXOPTIMFLAGS : -O -DNDEBUG
CXXDEBUGFLAGS : -g
LDXX : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++
LINKER : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++
LDFLAGS : -m64 -Wl,--no-undefined
LDTYPE : -shared
LINKEXPORT : -Wl,"C:\Program Files\MATLAB\R2016b/extern/lib/win64/mingw64/mexFunction.def"
LINKEXPORTVER : -Wl,"C:\Program Files\MATLAB\R2016b/extern/lib/win64/mingw64/exportsmexfileversion.def"
LIBLOC : C:\Program Files\MATLAB\R2016b\extern\lib\win64\mingw64
LINKLIBS : C:\Users\stddev\AppData\Local\Julia-0.6.0\lib\libjulia.dll.a -LC:\Users\stddev\AppData\Local\Julia-0.6.0\bin\..\lib -L"C:\Program Files\MATLAB\R2016b\extern\lib\win64\mingw64" -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas
LDOPTIMFLAGS : -s
LDDEBUGFLAGS : -g
OBJEXT : .obj
LDEXT : .mexw64
SETENV : set COMPILER=g++
set COMPFLAGS=-c -fexceptions -fno-omit-frame-pointer -std=c++11 -DJULIA_ENABLE_THREADING -m64 -DMATLAB_MEX_FILE -DMATLAB_MEX_FILE
set OPTIMFLAGS=-O -DNDEBUG
set DEBUGFLAGS=-g
set LINKER=g++
set LINKFLAGS=-m64 -Wl,--no-undefined -shared C:\Users\stddev\AppData\Local\Julia-0.6.0\lib\libjulia.dll.a -LC:\Users\stddev\AppData\Local\Julia-0.6.0\bin\..\lib -L"C:\Program Files\MATLAB\R2016b\extern\lib\win64\mingw64" -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas -Wl,"C:\Program Files\MATLAB\R2016b/extern/lib/win64/mingw64/mexFunction.def"
set LINKDEBUGFLAGS=-g
set NAME_OUTPUT= -o "%OUTDIR%%MEX_NAME%%MEX_EXT%"
MINGWROOT : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset
MATLABROOT : C:\Program Files\MATLAB\R2016b
ARCH : win64
SRC : C:\Users\stddev\src\mexjulia\mexjulia.cpp;"C:\Program Files\MATLAB\R2016b\extern\version\cpp_mexapi_version.cpp"
OBJ : C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.obj;C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\cpp_mexapi_version.obj
OBJS : C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.obj C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\cpp_mexapi_version.obj
SRCROOT : C:\Users\stddev\src\mexjulia\mexjulia
DEF : C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.def
EXP : C:\Users\stddev\src\mexjulia\mexjulia.exp
LIB : C:\Users\stddev\src\mexjulia\mexjulia.lib
EXE : C:\Users\stddev\src\mexjulia\mexjulia.mexw64
ILK : C:\Users\stddev\src\mexjulia\mexjulia.ilk
MANIFEST : C:\Users\stddev\src\mexjulia\mexjulia.mexw64.manifest
TEMPNAME : C:\Users\stddev\src\mexjulia\mexjulia
EXEDIR : C:\Users\stddev\src\mexjulia\
EXENAME : mexjulia
OPTIM : -O -DNDEBUG
LINKOPTIM : -s
CMDLINE1_0 : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++ -c -DJULIA_ENABLE_THREADING -m64 -DMATLAB_MEX_FILE -I"C:\Users\stddev\AppData\Local\Julia-0.6.0\include\julia" -I"C:\Program Files\MATLAB\R2016b/extern/include" -I"C:\Program Files\MATLAB\R2016b/simulink/include" -fexceptions -fno-omit-frame-pointer -std=c++11 -O -DNDEBUG C:\Users\stddev\src\mexjulia\mexjulia.cpp -o C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.obj
CMDLINE1_1 : C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++ -c -DJULIA_ENABLE_THREADING -m64 -DMATLAB_MEX_FILE -I"C:\Users\stddev\AppData\Local\Julia-0.6.0\include\julia" -I"C:\Program Files\MATLAB\R2016b/extern/include" -I"C:\Program Files\MATLAB\R2016b/simulink/include" -fexceptions -fno-omit-frame-pointer -std=c++11 -O -DNDEBUG "C:\Program Files\MATLAB\R2016b\extern\version\cpp_mexapi_version.cpp" -o C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\cpp_mexapi_version.obj
-------------------------------------------------------------------
Building with 'MinGW64 Compiler (C++)'.
C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++ -c -DJULIA_ENABLE_THREADING -m64 -DMATLAB_MEX_FILE -I"C:\Users\stddev\AppData\Local\Julia-0.6.0\include\julia" -I"C:\Program Files\MATLAB\R2016b/extern/include" -I"C:\Program Files\MATLAB\R2016b/simulink/include" -fexceptions -fno-omit-frame-pointer -std=c++11 -O -DNDEBUG C:\Users\stddev\src\mexjulia\mexjulia.cpp -o C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.obj
C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++ -c -DJULIA_ENABLE_THREADING -m64 -DMATLAB_MEX_FILE -I"C:\Users\stddev\AppData\Local\Julia-0.6.0\include\julia" -I"C:\Program Files\MATLAB\R2016b/extern/include" -I"C:\Program Files\MATLAB\R2016b/simulink/include" -fexceptions -fno-omit-frame-pointer -std=c++11 -O -DNDEBUG "C:\Program Files\MATLAB\R2016b\extern\version\cpp_mexapi_version.cpp" -o C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\cpp_mexapi_version.obj
C:\ProgramData\MATLAB\SupportPackages\R2016b\3P.instrset\mingw_492.instrset\bin\g++ -m64 -Wl,--no-undefined -shared -s -Wl,"C:\Program Files\MATLAB\R2016b/extern/lib/win64/mingw64/exportsmexfileversion.def" C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\mexjulia.obj C:\Users\stddev\AppData\Local\Temp\mex_6090246845018_13908\cpp_mexapi_version.obj C:\Users\stddev\AppData\Local\Julia-0.6.0\lib\libjulia.dll.a -LC:\Users\stddev\AppData\Local\Julia-0.6.0\bin\..\lib -L"C:\Program Files\MATLAB\R2016b\extern\lib\win64\mingw64" -llibmx -llibmex -llibmat -lm -llibmwlapack -llibmwblas -o C:\Users\stddev\src\mexjulia\mexjulia.mexw64
MEX completed successfully.
>> jl.eval('2+2')
ans =
int64
4
>>
I submitted a PR: https://github.com/twadleigh/mexjulia/pull/47
I may have missed something, but when I run jl.config() on Matlab2016A, Windows x86-64, Matlab yields
g++: error: libjulia.dll.a: No such file or directory
This seems obvious based on https://github.com/JuliaLang/julia/issues/13337
I have verified that there is not a file there, but other issues seem to have gotten past this point. Apologies if this is redundant, but I searched the issues and didn't see a workaround for a missing libjulia.dll.a
As an aside, mexjulia seems like an intriguing way to wean codebases off of MATLAB in a piecemeal fashion, which is rather exciting.
Here is the full output of jl.config():