Вызов ошибки MATLAB Engine: на вашем компьютере отсутствует libeng.dll

Я изо всех сил пытаюсь вызвать MATLAB из простой программы .cpp, несмотря на множество ресурсов в Интернете по этой проблеме.

Моя цель:

Используйте 64-разрядную версию Microsoft Visual Studio 2010 Professional для создания программы .cpp, которая вызывает MATLAB Engine для встроенных функций и графиков (64-разрядная версия MATLAB R2013b)

Что я наделал:

На страницах свойств файла .cpp у меня есть: 1) Изменил платформу на Активную (x64) 2) Добавил следующие пути к Исполняемым каталогам каталогов VC ++: C: \ Program Files \ MATLAB \ R2013b \ bin Включить каталоги: C: \ Program Files \ MATLAB \ R2013b \ extern \ include Справочные каталоги: C: \ Program Files \ MATLAB \ R2013b \ bin \ win64 Каталоги библиотеки: C: \ Program Files \ MATLAB \ R2013b \ extern \ lib \ win64 \ microsoft

Изменение пути

3) Написал следующую программу:

// mEng.cpp : Defines the entry point for the console application.
// libeng.dll is in C:\Program Files\MATLAB\R2013b\bin\win64

#include "stdafx.h"
#include <Engine.h>
#include <matrix.h>
#include <iostream>
#include <string>
#include <cmath>

#pragma comment (lib, "libmat.lib")
#pragma comment (lib, "libmx.lib")
#pragma comment (lib, "libmex.lib")
#pragma comment (lib, "libeng.lib")
#pragma comment (lib, "libut.lib")

using namespace std;


int main()
{
    Engine *m_pEngine;
    if (!(m_pEngine = engOpen(""))) 
          {
            fprintf(stderr, "\nCan't start MATLAB engine\n");
            return EXIT_FAILURE;
          }

    //Now call the MATLAB script through MATLAB Engine

          engEvalString(m_pEngine, "script");
          cout << "Hit return to continue\n\n";
          fgetc(stdin);

    //Close the MATLAB Engine

          engClose(m_pEngine);
          return EXIT_SUCCESS;
}

Получены ошибки:

«Программа не запускается, потому что на вашем компьютере отсутствует libeng.dll. Попробуйте переустановить программу, чтобы решить эту проблему ».


person E. Wash    schedule 26.05.2016    source источник
comment
Вы подтвердили, что ваш путь включает C: \ Program Files \ MATLAB \ R2013b \ bin \ win64?   -  person user4581301    schedule 26.05.2016
comment
Спасибо за ответ. Я отредактировал свой пост, добавив в него снимок экрана с моими каталогами путей (см. Ссылку «Изменения пути»). Мой путь включает C: \ Program Files \ MATLAB \ R2013b \ bin \ win64 в справочные каталоги, это то, что вы имели в виду?   -  person E. Wash    schedule 28.05.2016
comment
Имеется в виду системный путь: где система будет искать файлы во время выполнения. Если система не знает, где искать libeng.dll, значит, приспособление запущено. Откройте командную строку и введите path, чтобы проверить, есть ли в списке домашний каталог libeng.dll. Дополнительная информация: msdn.microsoft.com/en-CA/library/7d83bc18.aspx   -  person user4581301    schedule 28.05.2016
comment
Ах, вот и трюк! Я добавил PATH = C: \ Program Files \ MATLAB \ R2013b \ bin \ win64 в поле Environment в свойствах проекта - ›Отладка   -  person E. Wash    schedule 31.05.2016
comment
Это будет действовать только до тех пор, пока вы отлаживаете через IDE. Как только вы запустите приложение самостоятельно, вам придется повторить попытку. Рекомендуем добавить путь dll в системный PATH. Вы можете узнать, как это сделать для вашей версии Windows, с помощью быстрого веб-поиска.   -  person user4581301    schedule 31.05.2016


Ответы (2)


Я столкнулся с той же проблемой и потратил один день на ее решение. Итак, вот мой ответ.

Фактически вы переопределяете разные каталоги (см. Ссылку «Редактирование пути»). Достаточно сделать только эти:

  1. Свойства проекта -> Каталоги VC ++ -> Каталоги библиотек. Добавьте сюда путь C: \ Program Files \ MATLAB \ R2016a \ bin \ win64 (версия и путь могут отличаться, но идея состоит в том, чтобы указать путь к той же папке вашего MATLAB)
  2. Свойства проекта -> C / C ++ -> Общие -> Дополнительные каталоги включения. Добавьте путь C: \ Program Files \ MATLAB \ R2016a \ extern \ include (ваш путь к этой папке)
  3. Свойства проекта -> Компоновщик -> Общие -> Дополнительные каталоги библиотек. Добавьте путь C: \ Program Files \ MATLAB \ R2016a \ extern \ lib \ win64 \ microsoft
  4. Свойства проекта -> Компоновщик -> Ввод -> Дополнительные зависимости. Добавьте сюда: libeng.lib; libmx.lib;
  5. И последнее и самое важное: добавьте путь к библиотекам DLL MATLAB Engine в вашу Windows. Этот шаг решит вашу проблему. Мы можем сделать это следующим образом: Мой компьютер -> щелкните правой кнопкой мыши: Настройки. Открытое окно Система. Левый нижний угол: Расширенные настройки системы

введите здесь описание изображения

Продвинутая вкладка

введите здесь описание изображения

В переменных среды для вашего пользователя нажмите кнопку Create ... и добавьте это: Имя переменной: PATH Значение переменной: C: \ Program Files \ MATLAB \ R2016a \ bin \ win64

Этот путь указывает, где находится ваш libeng.dll. Важный момент: может потребоваться перезагрузка VS или даже перезагрузка компьютера.

Надеюсь, это поможет некоторым людям, которые начинают работать в MATLAB и C ++!

person Mikhail_Sam    schedule 09.08.2017

Следите за моими заметками здесь:

https://www.mathworks.com/matlabcentral/answers/100603-how-can-i-compile-a-matlab-engine-application-using-microsoft-visual-studio-9-0-or-10-0

Я хотел бы воспользоваться этой возможностью, чтобы переформатировать приведенные там инструкции:

Чтобы скомпилировать приложение механизма MATLAB в средах Microsoft Visual Studio 9.0 (2008) или Microsoft Visual Studio 10.0 (2010), выполните шаги, описанные ниже:

  1. Откройте Microsoft Visual Studio и выберите

    Файл- ›Новый-› Проект

    а затем выберите:

    Visual C ++ - ›Общие -› Пустой проект

    После этого введите название проекта и его местоположение в указанные текстовые области и нажмите OK.

    Обратите внимание, будьте очень осторожны с этим шагом, так как он создаст папку решения и поместит туда папку проекта, поэтому вы не захотите настраивать это, заставить все работать, а затем изменить папку, так как это сломает решение, и вы Придется начинать все сначала.

  2. Щелкните правой кнопкой мыши папку SOURCE FILES в SOLUTION EXPLORER и нажмите

    Добавить - ›Новый элемент ...

    Выберите файл C ++ (.cpp), введите имя файла (как enginedemo.cpp) по своему усмотрению. Щелкните ОК.

  3. Скопируйте код из исходного файла: engwindemo.c и вставьте его в этот файл enginedemo.cpp. Файл engwindemo.c можно получить по следующему адресу:

    $MATLABROOT/extern/examples/eng_mat
    

    где $MATLABROOT - корневой каталог MATLAB и может быть определен путем ввода команды:

    matlabroot
    

    в командной строке MATLAB.

    Я бы посоветовал вам открыть его в Блокноте и, если он имеет какой-то странный формат, исправить и сохранить его, чтобы он выглядел как обычный файл C, когда вы открываете его в Блокноте (или gedit, или что-то еще).

    Здесь все меняется в Visual Studio, и я надеюсь, что это прозрачно распространяется на VS Code, Eclipse или любую другую IDE, которую вы хотите использовать. Поэтому я перенумерую раздел изменения свойств римскими цифрами и исправлю порядок.

    Также не забудьте нажать ENTER, а затем APPLY после внесения каждого изменения. Убедитесь в изменении, прежде чем переходить к следующему разделу. Дважды проверьте орфографию и УБЕДИТЕСЬ, что каталоги существуют на вашей платформе.

  4. Перейдите в представление обозревателя решений, щелкните правой кнопкой мыши имя проекта и выберите СВОЙСТВА в обозревателе решений, чтобы открыть свойства проекта. Как только это окно откроется, внесите следующие изменения:

    Перейдите на панель конфигураций вверху страницы свойств. Вы определенно захотите начать с этой настройки. Выберите конфигурацию, отладку или выпуск, или все конфигурации, если вы хотите, чтобы изменения применялись к ОБЕИМ отладке и выпуску, или вам придется делать их снова и снова для другой конфигурации. Что может быть не такой уж плохой идеей, поскольку отдельные параметры выпуска часто являются более оптимизированными версиями соответствующих параметров отладки. Обратите внимание, что вы можете столкнуться с серьезными проблемами при изменении значений свойств при переключении между режимами отладки и выпуска, не удивляйтесь, если IDE выйдет из строя, база данных решения будет повреждена, даже отладка не будет построена, и вам придется начинать все сначала. Сначала заставьте отладку работать, сделайте резервную копию всего решения, затем клонируйте параметры отладки для выпуска, а затем настройте параметры выпуска по одному, следя за тем, чтобы код по-прежнему строился и запускался между каждым изменением.

    При компиляции в 64-битную Windows измените цель с x86 на x64 и используйте 64-битные библиотеки DLL и файлы библиотек.

    Если этого нет в параметрах конфигурации в самом верху, где указано Configuration Manager (как в VS2015), следуйте инструкциям IDE ... как указано по следующей ссылке:

    https://www.microsoft.com/en-us/download/details.aspx?id=55984

  5. Под

    Свойства конфигурации - ›Отладка

    Добавьте следующий целевой путь в среду: (для 32-битного MATLAB)

    PATH=$matlabroot\bin\win32
    

    (для 64-битного MATLAB)

    PATH=$matlabroot\bin\win64 If you want to use an absolute path instead, 
    

    используйте следующее (с точкой с запятой в конце)

    PATH=C:\Program Files\MATLAB\R2013a\bin\win32; (for 32 bit MATLAB)
    PATH=C:\Program Files\MATLAB\R2013a\bin\win64; (for 64 bit MATLAB)
    

    (возможно, вы можете пропустить PATH = здесь, поскольку он, похоже, не остается там, иначе это прямо из ссылки на MATLAB)

  6. В разделе C / C ++ General добавьте следующий каталог в поле ДОПОЛНИТЕЛЬНЫЕ КАТАЛОГИ ВКЛЮЧИТЬ:

    $MATLABROOT\extern\include
    

    i.e.

    c:\Program Files\MATLAB\R2019a\extern\include;
    

    Ставьте точку с запятой в конце каждой строки, которую вы вводите, это путь. также после файлов .lib в этом разделе.

    В разделе «Предварительно скомпилированные заголовки C / C ++» выберите «Не использовать предварительно скомпилированные заголовки». (в режиме выпуска это было установлено на да)

    В разделе Linker General добавьте каталог библиотеки в поле ДОПОЛНИТЕЛЬНЫЕ БИБЛИОТЕКИ: (для 32-разрядной Windows)

    $MATLABROOT\extern\lib\win32\microsoft
    

    (Для 64-битной Windows)

    $MATLABROOT\extern\lib\win64\microsoft
    

    то есть c: \ Program Files \ MATLAB \ Rxxxxx \ extern \ lib \ win (32 | 64) \ microsoft;

  7. В разделе «Ввод компоновщика» добавьте следующие имена библиотек в поле ДОПОЛНИТЕЛЬНЫЕ ЗАВИСИМОСТИ: (используйте эту строку перед тем, что там есть) libeng.lib; libmat.lib; libmx.lib; Я не знаю, действительно ли порядок имеет значение, но в исходной ссылке они перечислены в обратном алфавитном порядке. Я слышал оба варианта.

    Хорошо, теперь вы закончили изменять страницы свойств проекта VS, сохраните изменения (как вы все это делали, нажимая Применить после каждого изменения) и нажмите ОК. Окно страниц свойств закроется. На этом этапе ваш код будет построен, но по-прежнему не будет вызывать Matlab. Снова сделайте резервную копию решения.

    Теперь измените СТРОКУ ПУТИ СРЕДЫ DOS / WINDOWS. Я бы сохранил решение, закрывал VS, делал резервную копию, вносил изменения в PATH и снова открывал VS и пытался создать вашу программу, запустить ее и заставить ее работать. Строку PATH необходимо изменить так, чтобы каталог bin \ win (32:64) был первым экземпляром, связанным с Matlab на пути.

    Перейдите в расширенные системные настройки \ Среда. Для этого проверьте системный путь Windows, нажав Пуск - ›Щелкните правой кнопкой мыши Компьютер -› Свойства - ›Расширенные настройки системы -› Переменные среды - ›Системные переменные -› Открыть путь для редактирования. и измените переменную PATH следующим образом:

  8. Убедитесь, что в PATH находится следующий каталог: (для 32-разрядной Windows)

    $MATLABROOT\bin\win32
    

    (Для 64-битной Windows)

    $MATLABROOT\bin\win64
    

    Это не обязательно должен быть первый каталог в пути, но он должен быть первым каталогом MATLAB в пути

    PATH=c:\;....;c:\Program Files\MATLAB\Rxxxxx\bin\win(32/64);
    

    matlab.exe находится в \bin; вы можете захотеть, чтобы это было на пути также только не перед записью \ bin \ win64 ...

    Примечание: Если на машине установлено более одного MATLAB, каталог для целевой платформы должен быть впереди любого другого каталога MATLAB (например, при компиляции 64-битного приложения каталог в 64-битной установке MATLAB должен быть первый на ПУТИ).

    Также убедитесь, что ваша целевая установка MATLAB зарегистрирована как COM-сервер:

    https://www.mathworks.com/help/matlab/ref/regmatlabserver.html Для Matlab 2020a и более поздних версий попробуйте comserver ('query') и comserver ('register'). Для 2019 и более ранних версий используйте regmatlabserver () (запустите Matlab от имени администратора).

  9. Скомпилируйте и запустите приложение.

    Поэтому я включаю простое приложение, которое должно продемонстрировать его функциональность: #include stdafx.h #include engine.h #include

    using namespace std;
    int main()
    {
    Engine *eng;
    eng=engOpen("");    // put a breakpoint here
    cout << "...now you see it...\n"
    engClose(eng);      // put a breakpoint here
    cout << "...now you don't!\n"
    return 0;
    }
    
person Sam Gray    schedule 28.01.2021
comment
Это похоже на код, потому что вы использовали отступ в 4 пробела для форматирования всего сообщения, которое предназначено для кода, а не для обычного текста. . Это очень затрудняет отслеживание. На той же странице также объясняется, как использовать правильное форматирование для ответов. Пожалуйста, прочтите его, особенно раздел простых списков, если вы хотите повторить попытку. Кроме того, я еще раз перечитал ваше сообщение и все еще не вижу каких-либо объяснений по вопросам форматирования, которые я задал, как вы утверждали. Вы ведь понимаете, что мы можем видеть историю редактирования, верно? - person Calculuswhiz; 08.06.2021
comment
Кроме того, я еще раз перечитал ваш пост и до сих пор не вижу никаких объяснений по вопросам форматирования, которые я задал, как вы утверждали. Вы ведь понимаете, что мы можем видеть историю редактирования, верно? - ну, может быть, ты сможешь, но я точно не могу, и ты знаешь, почему это так, верно? Так что сейчас это спорный вопрос, верно? В следующий раз попробуйте прочитать Руководство по модерации форума, прежде чем удалять комментарий, который вы предлагаете мне попробовать еще раз. О боже, у меня ушло больше 5 минут ... - person Sam Gray; 14.06.2021
comment
Вы знаете, почему это так? Нет, не знаю, потому что даже как анонимный пользователь я могу видеть историю изменений в этом сообщении. Возможно, вы говорите об удаленном комментарии к этому посту? Я их тоже не вижу. Комментарии могут быть помечены, если они грубые / оскорбительные или больше не актуальны, и могут быть удалены без предварительного уведомления. Никто не пытается атаковать вас лично. Это касается только содержимого и форматирования. Все, что я хотел знать, это почему он был отформатирован таким образом. Было ли последнее изменение не тем, что вы хотели? - person Calculuswhiz; 14.06.2021