Я не могу запустить Matlab Engine с использованием matlab 2014a, Win7 64bit, 64bit build из программы на c ++ с использованием VS2012 или VS2013, компилятора Intel. Я могу запустить двигатель нормально, используя Matlab 2013a. Если я ссылаюсь на 2014a, программа жалуется, что libmwmfl_scalar.dll отсутствует и не запускается. Это dll, которая была включена в 2013, но, похоже, больше не включена в 2014a (ни в программе, ни в дистрибутиве времени выполнения компилятора). Если я сделаю ссылку на 2013a, то это не вызовет проблем. Зачем настаивать на старой DLL при обновлении до 2014a? Я изменил все включает, libs, environment на 2014a и перестроен после очистки. Я не имею явной ссылки на libmwmfl_scalar.dll в моих свойствах и изменил все папки на 2014a. Я не ссылаюсь ни на что другое, использующее Matlab. Эта dll не отображается, если я запускаю средство обхода зависимостей на связанном исполняемом файле.
Настройки как в этом листе свойств из другого поста (Вызов MATLAB напрямую (многопоточность) в Visual Studio), который обеспечивает некоторый соответствующий контекст.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<LocalDebuggerEnvironment>PATH=C:\Program Files\MATLAB\R2014a\bin\win64;%PATH%$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>C:\Program Files\MATLAB\R2014a\extern\include;C:\Program Files\MATLAB\R2014a\extern\include\win64</AdditionalIncludeDirectories>
<PreprocessorDefinitions>IBMPC</PreprocessorDefinitions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>C:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft</AdditionalLibraryDirectories>
<AdditionalDependencies>libmx.lib;libmex.lib;libmat.lib;libeng.lib;mclmcrrt.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
Бен — нет, я не использую файлы Mex. Это код, который вызывает Matlab
void mlsurfaceplot(std::vector<std::vector<double>> surface,std::vector<double> Xdat,std::vector<double> Ydat)
{
Engine *ep;
mxArray *Xmx = NULL, *result = NULL;
mxArray *Ymx=NULL;
mxArray *Zmx=NULL;
char buffer[BUFSIZE+1];
// double tim[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
//Have to stick vectors in arrays for Matlab xfer
double *xArray; //Declare pointer to type of array
xArray = new double[Xdat.size()]; //use 'new' to create array of size x
double *yArray; //Declare pointer to type of array
yArray = new double[Ydat.size()]; //use 'new' to create array of size x
double *zArray; //Declare pointer to type of array
zArray = new double[Xdat.size()*Ydat.size()]; //use 'new' to create array of size x
for (int j = 0; j < Xdat.size(); j++)
{
xArray[j]=Xdat[j];
}
for (int j = 0; j < Ydat.size(); j++)
{
yArray[j]=Ydat[j];
}
for (int i = 0; i < Xdat.size(); i++)
{
for (int j = 0; j < Ydat.size(); j++)
{
zArray[i+Xdat.size()*j]=surface[i][j];
}
}/*
* Call engOpen with a NULL string. This starts a MATLAB process
* on the current host using the command "matlab".
*/
if (!(ep = engOpen(""))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
//return EXIT_FAILURE;
}/*
* Create a variable for our data
*/
using namespace std;
Xmx = mxCreateDoubleMatrix(1,Xdat.size(), mxREAL);
Ymx = mxCreateDoubleMatrix(1,Ydat.size(), mxREAL);
Zmx = mxCreateDoubleMatrix(Xdat.size(), Ydat.size(), mxREAL);
//T = mxCreateDoubleMatrix(3, 2, mxREAL);
//memcpy((void *)mxGetPr(T), (void *)tim, sizeof(tim));
memcpy(mxGetPr(Xmx), &xArray[0], sizeof(double)*Xdat.size());
memcpy(mxGetPr(Ymx), &yArray[0], sizeof(double)*Ydat.size());
memcpy(mxGetPr(Zmx), &zArray[0], sizeof(double)*Xdat.size()*Ydat.size());
//std::cout<<T[0]<<std::endl;
/*
* Place the variable T into the MATLAB workspace
*/
engPutVariable(ep, "X", Xmx); engPutVariable(ep, "Y", Ymx);
engPutVariable(ep, "Z", Zmx);
std::cout<<*mxGetPr(Xmx)<<std::endl;
std::cout<<*mxGetPr(Ymx)<<std::endl;
std::cout<<*mxGetPr(Zmx)<<std::endl;
std::cout<<*(mxGetPr(Xmx)+1)<<std::endl;
std::cout<<*(mxGetPr(Ymx)+1)<<std::endl;
std::cout<<*(mxGetPr(Zmx)+1)<<std::endl;/*
* Plot the result
*/
engEvalString(ep, "surf(X,Y,Z')");
engEvalString(ep, "ylabel('Log Spot/Strike')");
engEvalString(ep, "xlabel('Expiry (Years)')");
engEvalString(ep, "zlabel('Black 76 Vol')");
engEvalString(ep, "alpha(0.5)");
engEvalString(ep,"saveas(figure1,'c:\\users\\Rodney\\Documents\\filename2.jpg'),'jpg'");/*
* use fgetc() to make sure that we pause long enough to be
* able to see the plot
*/
printf("Hit return to continue\n\n");
fgetc(stdin);
int jj;
cin>>jj;
/*
* We're done for Part I! Free memory, close MATLAB figure.
*/
printf("Done for Part I.\n");mxDestroyArray(Xmx);
mxDestroyArray(Ymx);
mxDestroyArray(Zmx);
// mxDestroyArray(T);
engEvalString(ep, "close;");
// return 0;
}
Вот мой Путь, с подарками 2013a и 2014a. Я также пытался удалить 2013a, перезапустить VS, перестроить, но он все еще ищет старую DLL.
C: \ Program Files (x86) \ Common Files \ Intel \ Shared Libraries \ redist \ intel64 \ mpirt; C: \ Program Files (x86) \ Common Files \ Intel \ Shared Libraries \ redist \ ia32 \ mpirt; C: \ Program Файлы (x86) \ Common Files \ Intel \ Shared Libraries \ redist \ intel64 \ compiler; C: \ Program Files (x86) \ Common Files \ Intel \ Shared Libraries \ redist \ ia32 \ compiler; C: \ Program Files (x86) \ Intel \ icsxe \ 2013.1.046 \ bin; C: \ Program Files \ MATLAB \ R2014a \ bin; C: \ Program Files \ MATLAB \ R2014a \ bin \ win64; C: \ Users \ Родни \ Anaconda \ Lib \ site- пакеты \ PyQt4; C: \ Program Files (x86) \ Intel \ Trace Analyzer and Collector \ 8.1.4.045 \ bin; C: \ Program Files (x86) \ Intel \ MPI \ 4.1.3.045 \ em64t \ bin; C: \ Программные файлы (x86) \ Intel \ MPI \ 4.1.3.045 \ ia32 \ bin; C: \ Program Files (x86) \ Общие файлы \ Intel \ Shared Libraries \ redist \ intel64 \ mpirt; C: \ Program Files (x86) \ Общие файлы \ Intel \ Shared Libraries \ redist \ ia32 \ mpirt; C: \ Program Files (x86) \ Общие файлы \ Intel \ Shared Libraries \ redist \ intel64 \ compiler; C: \ Program Files (x86) \ Общие файлы \ Intel \ Shared Libraries \ redist \ ia32 \ compiler; C: \ PROGR А ~ 2 \ Intel \ MPI \ 411 ~ 1,036 \ EM64T \ бин; C: \ PROGRA ~ 2 \ Intel \ COMPOS ~ 1 \ Bin \ Intel64; C: \ PROGRA ~ 2 \ Intel \ COMPOS ~ 1 \ Redist \ Intel64 \ компилятор; C: \ PROGRA ~ 2 \ MICROS; C: \ Program Files (x86) \ Windows Kits \ 8.1 \ Windows Performance Toolkit \; C: \ Program Files \ Microsoft SQL Server \ 110 \ Tools \ Binn \; C: \ Программные файлы (x86) \ Microsoft ASP.NET \ ASP.NET Web Pages \ v1.0 \; C: \ Программные файлы (x86) \ Общие файлы \ Seagate \ SnapAPI \; C: \ Program Files \ MATLAB \ R2014a \ runtime \ win64; C: \ Program Files \ MATLAB \ R2014a \ polyspace \ bin; \ win64; C: \ Program Files \ MATLAB \ MATLAB Runtime компилятора \ v83 \ runtime \ win64; C: \ Program Files \ MATLAB \ R2013a \ runtime \ win64; C: \ Program Files \ MATLAB \ R2013a \ bin; C: \ Program Files \ MATLAB \ R2013a \ bin \ win64; C: \ Users \ Родни \ Anaconda; C: \ Users \ Родни \ Anaconda \ Scripts; C: \ PROGRA ~ 2 \ Gambit-C \ v4.7.2 \ bin; C: \ Users \ Rodney \ AppData \ Roaming \ cabal \ bin; C: \ Program Files (x86) \ Intel \ Trace Analyzer and Collector \ 8.1.4.045 \ dll \ impi64; C: \ Program Files (x86) \ Intel \ Trace Analyzer and Collector \ 8.1.3.037 \ dll \ impi64; C: \ Program Files \ smartmontools \ bin; C: \ ghc- 7.6.3 \ bin; C: \ Program Files (x86) \ WinAnt \ bin; c: \ windows \ system32; C: \ Users \ Rodney \ AppData \ Roaming \ cabal \ bin \; C: \ Program Files \ MiKTeX 2.9 \ miktex \ bin \ x64 \; C: \ Program Files (x86) \ Microsoft SDKs \ TypeScript \ 1.0 \
Обновление: я попытался создать новое решение и проект в VS2013, и он работает с ML2014a. Так что это должно быть что-то, что влияет на мой существующий проект или решение, но это очень трудно отследить, так как у меня нет косвенных зависимостей от Matlab и я установил все пути к версии 2014a. Моя программа использует внешние библиотеки Boost, Intel MKL, Armadillo, Eigen, Quantlib. Совершенно в тупик.
Обновление 2:
Я проверил, и моя программа работает, когда она связана с 2014a вне среды Visual Studio. Когда я пытаюсь запустить его из VS для целей отладки («отладка / запуск отладки» или «отладка / запуск без отладки»), он не запускается из-за отсутствия libmwmfl_scalar.dll. Поэтому по какой-то причине VS настаивает на этом, чтобы запустить программу, когда сама программа не использует ее.
Задача ещё не решена.