Как создать простой дистрибутив Octave без установки Octave - PullRequest
20 голосов
/ 02 октября 2010

Документация Octave по этому вопросу является пугающей и редкой.

Я не знал, где еще документировать найденное решение, поэтому я публикую здесь. Я прошу прощения, если это неуместно, но я хочу помочь следующему парню.

Следующее решение предназначено для простого дистрибутива Windows.

Вариант использования:
Решение разработано в Octave 3.2.4 и должно быть распространено среди конечных пользователей с небольшим количеством навыков работы с компьютером. Установка и объяснение Octave невозможно, решение должно быть «одним щелчком мыши» или «просто до мозга костей».

Известные проблемы:
imread завершается неудачно в 3.2.4, потому что file_in_path.m неверен. Вам нужно обновить файл file_in_path.m следующим образом (просто замените его):

function name=file_in_path(p,file)
  idx=[1 findstr(p,pathsep) length(p)+1];
  for i=1:length(idx)-1
    if idx(i+1)-idx(i)<=1
      dir=strcat(pwd,"/");
    else
      dir=p(idx(i)+1:idx(i+1)-1);
    end
    name = fullfile(dir, file);
    fid = fopen(name,"r");
    if fid >= 0
      fclose(fid);
      return
    end
  end
  fid = fopen(file,"r");
  if fid >= 0,
    fclose(fid);
    name=file;
    return
  end
  name=[]; 

Ответы [ 7 ]

11 голосов
/ 19 августа 2012

Решение: создайте распространяемый exe-файл, используя mkoctfile, и запакуйте этот exe-файл основными файлами Octave и другими файлами .oct и .m, если необходимо.

Шаг 1: Создайте автономный файлИсполняемый файл.

Вы можете увидеть код, который работает здесь: http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html

В частности, файл "embedded.cc".

Я упростил этот файл следующим образом:

#include <iostream>
#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/parse.h>

int
main (int argc, char *argvc[])
{
  string_vector argv (2);
  argv(0) = "embedded";
  argv(1) = "-q";

  octave_main (2, argv.c_str_vec(), 1);

  octave_value_list in = octave_value (argvc[1]);
  octave_value_list out = feval ("your_custom_m_file", in);

  if (!error_state && out.length () > 0)
    {
    }
    else
    {
        std::cout << "invalid\n";
    }

  return 0;
}

Создайте этот файл с помощью команды

mkoctfile --link-stand-alone embedded.cc -o embedded

. Он может выдавать предупреждения, но до тех пор, пока он не выдаст ошибок, все будет в порядке.Файл embedded.exe будет собран и может быть запущен.Единственная проблема заключается в том, что ему не хватит всех вкусностей, которые делают октаву потрясающей.Вам нужно будет их предоставить.

Шаг 2: Создать дистрибутивную папку

Вам потребуется создать копию многих файлов Octave.Я предлагаю каталог специально для этого.Как минимум, вам понадобится копия всех или большинства библиотек DLL в \ bin.Кроме того, поместите свой распространяемый исполняемый файл в этот каталог.

Шаг 3: Другие файлы whack-a-mole

Теперь вам необходимо выяснить, какие другие файлы будутнеобходимо запустить ваш .m скрипт.Вы можете упростить этот шаг, скопировав \ oct \ i686-pc-mingw32 * .oct и \ share \ octave \ 3.2.4 \ m \ * \ *. M в каталог дистрибутива, хотя это будет излишним и фактически не будетпредотвратите шаг «удар-моль».

Теперь вы должны сыграть «удар-моль» или проверенную временем традицию «где могут быть мои, йо?»

  1. Откройте командную строку и перейдите в папку вашего дистрибутива.
  2. Избавьтесь от любых полезных строк PATH.Ваши клиенты их не получат.
  3. Попытка запустить программу embedded.exe.Вы получите сообщение об ошибке, например следующее:

    embedded.exe
    ошибка: `max 'не определено в столбце 83 строки 22 * ​​1044 * ошибка: оценка элемента списка аргументов номер 1
    ошибка: вычисление элемента списка аргументов номер 1
    ошибка: вызвано из:
    ошибка: T: \ sms \ Development \ research \ c2 \ disttest \ strcat.m в строке 83, столбец 3
    ошибка: T:\ sms \ Development \ research \ c2 \ disttest \ file_in_path.m в строке 5, столбец 10
    ошибка: T: \ sms \ Development \ research \ c2 \ disttest \ imread.m в строке 50, столбец 6

  4. A Найдите в вашей установке Octave значение "max".Это будет файл .oct или .m.В данном случае это файл .oct, max.oct.Скопируйте его в каталог дистрибутива.

    B Вы ищете что-то очевидное, например, "min", и не получаете результатов.Это связано с тем, что загружаемая функция "min" находится в файле .oct "max.oct".Сделайте копию max.oct и переименуйте ее в min.oct.Это будет работать сейчас.Как вы знаете, где функции?Я не уверен.Большинство из них находятся в очевидных местах, таких как «max.oct» для min и «fft2.oct» для «ifft2.oct».Удачи со всем этим.

  5. Повторяйте, пока ваш исполняемый файл не запустится.

5 голосов
/ 09 января 2013

Просто добавьте, что если вы хотите запустить скрипт вместо функции m, тогда строка встроенного .cc :

octave_value_list out = feval ("your_custom_m_file", in);

должна быть:

octave_value_list out = feval ("your_custom_m_script");

Также используйте «который», чтобы найти, где упакованы недостающие функции.Например, для функции min:

octave:22> which min

min - это функция из файла C: \ Octave \ Octave3.6.2_gcc4.6.2 \ lib \ octave \ 3.6.2 \ oct \ i686-pc-mingw32 \ max.oct

1 голос
/ 31 марта 2016

В приведенном выше решении в пуле 4 B:

B Вы ищете что-то очевидное, например, "min", и не получаете результатов.Это связано с тем, что загружаемая функция "min" находится в файле .oct "max.oct".Сделайте копию max.oct и переименуйте ее в min.oct.Теперь это будет работать.

Это может не сработать, если какая-то функция вызывается из @folder function.m, а также чтобы избежать ненужных дублированных файлов, просто добавьте следующий код где-нибудь в вашем файле m вне @папка

autoload ("min", "max.oct");

Аналогично, ее можно удалить с помощью

autoload ("min", "max.oct", "remove");

. Убедитесь, что здесь указан путь к max.oct.

Приведенное выше понимание основано нафайл PKG_ADD и PKG_DEL в пакете связи, расположенном по адресу \ Octave-4.0.1 \ lib \ octave \ packages \ communications-1.2.1 \ i686-w64-mingw32-api-v50 + \

1 голос
/ 03 сентября 2015

Пробег mkoctfile --link-stand-alone embedded.cc -o embedded

из октавного раствора, а не из пакетного файла.

Только что спас тебе полдня (-;

1 голос
/ 08 июля 2015

Что-то, что я обнаружил при связывании моего пользовательского m-файла с автономным Octave:

  1. Требуется #include <octave/toplev.h>
  2. Замените return 0; (как указано выше) на clean_up_and_exit(0);

Без этих шагов моя программа неоднократно вылетала при выходе.

0 голосов
/ 31 августа 2017

У меня было то же самое требование (одним щелчком мыши, просто мертвым мозгом), поэтому я сделал настройку, которая содержала только curl.exe, командный файл ниже, исполняемый файл, который был замаскированным .bat (просто вызывая пакетный файл ниже) и скрипт .vbs ниже (не написанный мной). И конечно же мой м-файл.

Это загрузит Octave 4.2.1 как переносимую программу (32-битную, в противном случае нам придется загружать снова, если система окажется 32-битной), распаковать с помощью скрипта vbs, переместить содержимое в ту же папку как командный файл и запустить его в режиме графического интерфейса. Каждый раз, когда вызывается тот же сценарий, он будет проверять, все ли еще существует файл octave.bat.

Конечно, это приводит к огромной трате дискового пространства, загрузке zip-файла размером 280 МБ, распаковка которого занимает более 1 ГБ (что еще хуже, если я не удаляю zip-файл впоследствии), и вы застряли в окне cmd, которое не легко спрятаться.

Но он предлагает самое простое решение, которое я мог найти. Это также с меньшей вероятностью сломается в будущем (либо с вашим собственным обновлением, либо с обновлением от Octave). В один прекрасный день mkoktfile будет на самом деле простым в использовании и будет решать зависимости самостоятельно, но до этого дня это остается наименее вызывающим головную боль решением, которое я мог найти. А аспирин дороже чужого дискового пространства.

::this file will test if the octave portable is downloaded and unpacked
@ECHO OFF

SET my_m_file=your_mfile.m
SET name_of_this_script=run_me.bat

::if the file exists, skip to the actual running.
IF EXIST "octave.bat" goto OctaveIsExtracted
IF EXIST "octave-4.2.1-w32.zip" goto OctaveIsDownloaded
ECHO The runtime (Octave portable 4.2.1) will now be downloaded.
ECHO This may take a long time, as it is about 280MB.
ECHO .
ECHO If this download restarts multiple times, you can manually download the octave-4.2.1-w32.zip from the GNU website. Make sure to unpack the contents.
::if this errors, you can uncomment the line with archive.org (which doesn't report total size during download)
curl http://ftp.gnu.org/gnu/octave/windows/octave-4.2.1-w32.zip > octave-4.2.1-w32.zip
::curl http://web.archive.org/web/20170827205614/https://ftp.gnu.org/gnu/octave/windows/octave-4.2.1-w32.zip > octave-4.2.1-w32.zip
:OctaveIsDownloaded
::check to see if the file size is the correct size to assume a successful download
::if the file size is incorrect, delete the file, restart this script to attempt a new download
::file size should be 293570269 bytes
call :filesize octave-4.2.1-w32.zip
IF /I "%size%" GEQ "293560000" goto OctaveIsDownloadedSuccessfully
del octave-4.2.1-w32.zip
::start new instance and exit and release this one
start %name_of_this_script%
exit
:OctaveIsDownloadedSuccessfully
IF EXIST "octave.bat" goto OctaveIsExtracted
::unzip and move those contents to the current folder
ECHO Unzipping octave portable, this may take a moment.
cscript //B j_unzip.vbs octave-4.2.1-w32.zip
SET src_folder=octave-4.2.1
SET tar_folder=%cd%
for /f %%a IN ('dir "%src_folder%" /b') do move %src_folder%\%%a %tar_folder%
pause
:OctaveIsExtracted
octave.bat %my_m_file%
goto :eof

:filesize
  set size=%~z1
  exit /b 0

И j_unzip.vbs

' j_unzip.vbs
'
' UnZip a file script
'
' By Justin Godden 2010
'
' It's a mess, I know!!!
'

' Dim ArgObj, var1, var2
Set ArgObj = WScript.Arguments

If (Wscript.Arguments.Count > 0) Then
 var1 = ArgObj(0)
Else
 var1 = ""
End if

If var1 = "" then
 strFileZIP = "example.zip"
Else
 strFileZIP = var1
End if

'The location of the zip file.
REM Set WshShell = CreateObject("Wscript.Shell")
REM CurDir = WshShell.ExpandEnvironmentStrings("%%cd%%")
Dim sCurPath
sCurPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".")
strZipFile = sCurPath & "\" & strFileZIP
'The folder the contents should be extracted to.
outFolder = sCurPath
'original line: outFolder = sCurPath & "\"

 WScript.Echo ( "Extracting file " & strFileZIP)

Set objShell = CreateObject( "Shell.Application" )
Set objSource = objShell.NameSpace(strZipFile).Items()
Set objTarget = objShell.NameSpace(outFolder)
intOptions = 256
objTarget.CopyHere objSource, intOptions

 WScript.Echo ( "Extracted." )
0 голосов
/ 27 декабря 2015

Оформить Stratego Octave Compiler .

(я еще не тестировал, но планирую сделать это в ближайшие несколько дней.)

...