mcc создает не отвечающий исполняемый файл

Я пытаюсь скомпилировать функцию Matlab, используя функцию mcc. Моя функция записывает строку текста в файл.

function hello()
    ofid = fopen('hello.txt','w');
    fprintf(ofid, 'Hello there, this is matlab.\n');
    fclose(ofid);
end

Он работает, как и ожидалось, при вызове из консоли Matlab. Однако, когда я компилирую файл в исполняемый файл, используя mcc

/opt/matlab/matlab2008a/bin/mcc -m hello.m

и запустить его как

./hello

Кажется, что он работает вечно и не создает файла hello.txt. Как исполняемый файл, так и функциональные файлы Matlab находятся в рабочем каталоге Matlab.

Я не вижу, что может быть неправильным в моем использовании mcc. Пожалуйста помоги.


person Pavithran Iyer    schedule 15.01.2016    source источник
comment
Он создает файл?   -  person Dan    schedule 16.01.2016
comment
Нет, запуск исполняемого файла, кажется, ничего не делает. Он не создает файл и не завершает работу.   -  person Pavithran Iyer    schedule 16.01.2016
comment
Когда вы запускаете hello(); он создает необходимый файл. Почему вы хотите запустить его через /opt/matlab/matlab2008a/bin/mcc -m hello.m? просто запустите привет();   -  person Dan    schedule 17.01.2016
comment
Извините, не понял вашего предложения. Вы имеете в виду, почему бы мне просто не вызвать hello() в консоли Matlab? Что ж, причина использования MCC заключается в том, что как только я получаю исполняемый файл, выполняющий работу функции Matlab, мне, по-видимому, больше не нужна лицензия Matlab для запуска исполняемого файла. Так что это может быть полезно, когда у меня есть ограниченное количество лицензий Matlab для использования.   -  person Pavithran Iyer    schedule 18.01.2016


Ответы (1)


Как правило, вам необходимо настроить среду выполнения MATLAB при выполнении приложений, скомпилированных mcc.

Вы, вероятно, получите больше пользы в первый раз, используя deploytool (из командной строки) для компиляции вашей программы hello.m здесь. Разработчик приложений MATLAB создаст файл run_hello.sh, который вы можете просмотреть, чтобы увидеть, как они настраивают свои библиотеки. Затем, чтобы выполнить вашу программу, вы бы назвали ее так:

./run_hello.sh/Приложения/MATLAB/MATLAB_Runtime/v90/

Примечание. Я только что указал общее местоположение для среды выполнения MATLAB, но фактическое местоположение будет зависеть от вашей платформы и версии MATLAB, в которой вы создали приложение.

person informaton    schedule 17.01.2016
comment
Спасибо за ваш ответ и рассказ о deploytool, похоже, проблема почти решена, за исключением того, что когда я создаю свой проект с использованием deploytool, он, кажется, помещает исполняемый файл (и файл .sh, который вы упомянули) внутри пути к папке: привет /раздать/ . В идеале я хотел бы, чтобы исполняемый файл находился в той же папке, что и функция Matlab. Однако это не имеет большого значения. Лучше ли использовать файл run_hello.sh, как вы предложили, а не напрямую запускать исполняемый файл как: ./hello ? - person Pavithran Iyer; 18.01.2016
comment
Есть ли способ заставить deplytool выводить исполняемый файл и/или файл run_hello.sh в том же каталоге, что и основная функция Matlab? Вместо структуры папок... - person Pavithran Iyer; 18.01.2016
comment
@Pavithran Да, вы можете изменить место создания файлов дистрибутива, изменив параметры упаковки, найденные с помощью «deploytool». Я предполагаю, что будет проще просто скопировать файлы, когда вы закончите. См. эту ссылку mathworks .com/help/compiler/ (шаг 7), чтобы узнать, как все это изменить. То, как вы расширяете эти последующие комментарии, мне интересно, не лучше ли вам написать свой метод на C и скомпилировать его с помощью «mex» для запуска из MATLAB. - person informaton; 22.01.2016
comment
@Pavithran И нет, вы не можете просто запустить исполняемый файл как ./hello. Если вы отредактируете файл «run_hello.sh», вы должны увидеть, как загружаются и настраиваются библиотеки времени выполнения, прежде чем будет сделан эквивалентный вызов «./hello» с переданными аргументами командной строки (например, «MATLAB_Runtime/v90»). . Я надеюсь, что это поможет некоторым. - person informaton; 22.01.2016
comment
@information Вы правы, что не запускаете исполняемый файл напрямую, спасибо, что рассказали мне об этом. - person Pavithran Iyer; 22.01.2016
comment
@information Да, это правда, я немного читал (в том числе по ссылке, которую вы упомянули) об изменении выходного каталога deploytool. На самом деле это не просто, поэтому, как вы предложили, я просто копирую run.sh и исполняемый файл в нужное мне место. - person Pavithran Iyer; 22.01.2016
comment
@information Я думаю, что тогда я отвлекал вас своими последующими комментариями. Я намерен в конечном итоге не использовать Matlab. Причина в том, что я хочу запустить код на многих узлах в кластере, и невозможно предположить, что существует множество лицензий для поддержки многих версий Matlab. - person Pavithran Iyer; 22.01.2016
comment
Наконец, я думаю, что ответ помог мне решить мою проблему, и исполняемый файл запускается и выдает ожидаемые результаты! - person Pavithran Iyer; 22.01.2016
comment
@Pavithran - понял. Часть лицензии имеет смысл для того, что вы хотите сделать (т.е. а не для компиляции мекса). Одна проблема, которая у вас все еще может возникнуть, заключается в том, что вся библиотека времени выполнения должна загружаться каждый раз, когда вы запускаете скомпилированное приложение. То есть до запуска вашей программы (с момента ее вызова или нажатия на .exe) пройдет примерно столько же времени, сколько и до открытия MATLAB. Так что, если у вас есть кластер и куча узлов, и вы надеетесь вызывать вашу скомпилированную программу несколько раз, как функцию, вы столкнетесь с серьезным компромиссом во времени. - person informaton; 22.01.2016
comment
@information, спасибо за полезную заметку. Это может быть наиболее подходящей причиной моего наблюдения за более длительным, чем ожидаемое, временем выполнения. Я все еще новичок в компиляторе Matlab, но, возможно, нет реального решения этой проблемы. - person Pavithran Iyer; 24.01.2016