如何在不安装Octave的情况下创建简单的Octave可分发

Noa*_*oah 21 octave

关于这个主题的Octave文档既令人生畏又稀疏.

我不知道在哪里记录我找到的解决方案,所以我在这里发帖.如果这不合适我道歉,但我想帮助下一个人.

以下解决方案适用于可分发的简单窗口.

使用案例:
在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=[]; 
Run Code Online (Sandbox Code Playgroud)

ron*_*chn 11

解决方案:使用mkoctfile创建可分发的exe,并根据需要将此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;
}
Run Code Online (Sandbox Code Playgroud)

使用该命令构建此文件

mkoctfile --link-stand-alone embedded.cc -o embedded
Run Code Online (Sandbox Code Playgroud)

它可能会发出警告,但只要不抛出任何错误,你应该没问题.将构建embedded.exe文件,并且可以运行该文件.唯一的问题是,它将缺少使八度音程变得令人敬畏的所有好东西.你必须提供这些.

第2步:创建分发文件夹

您需要创建许多Octave文件的副本.我建议专门为此目录.至少,您需要\ bin中所有或大多数DLL的副本.此外,将可分发的可执行文件放在此目录中.

第3步:其他文件打击鼹鼠

您现在需要找出运行.m脚本所需的其他文件.您可以通过将\ oct\i686-pc-mingw32*.oct和\ share\octave\3.2.4\m\*\*.m复制到分发目录来简化此步骤,尽管这样做会有些过分,并且实际上不会防止打鼹鼠的步骤.

现在,你必须玩"打包鼹鼠"或"我包括在哪里,哟?"这个历史悠久的传统.

  1. 打开cmd提示符并导航到您的分发文件夹.
  2. 摆脱任何有用的PATH字符串.您的客户不会拥有它们.
  3. 尝试运行嵌入式程序.您将收到如下错误:

    embedded.exe
    错误:'max'undefined接近第83行第22列
    错误:评估参数列表元素编号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. 一个在八度安装搜索"最大".它将是.oct或.m文件.在这种情况下,它是.oct文件,max.oct.将其复制到您的分发目录.

    B你搜索明显像"min"这样的东西,并没有得到任何结果.这是因为可装载功能"min"位于.oct文件"max.oct"中.制作max.oct的副本,并将其重命名为min.oct.它现在可以工作了.你怎么知道这些功能在哪里?我不确定.他们中的大多数都在明显的地方,例如"max.oct"表示min,"fft2.oct"表示"ifft2.oct".祝你好运.

  5. 重复直到可执行文件运行.

  • 但请注意,如果您这样做,您的代码需要在GPL兼容许可下发布,因为Octave本身就是GPLv3 +本身并且您将代码链接到它.来自他们的常见问题解答(http://wiki.octave.org/FAQ#If_I_write_code_using_Octave_do_I_have_to_release_it_under_the_GPL.3F)"使用Octave的本机插件接口(也称为.oct文件)编写的代码必然与Octave内部链接相关联,并被视为衍生产品Octave的工作,因此必须根据与GPL兼容的条款发布" (4认同)

小智 5

只需添加一下,如果您想运行脚本而不是m函数,那么Embedded.cc的代码行如下:

octave_value_list out = feval ("your_custom_m_file", in);
Run Code Online (Sandbox Code Playgroud)

应该:

octave_value_list out = feval ("your_custom_m_script");
Run Code Online (Sandbox Code Playgroud)

也可以使用“哪个”来查找缺少的函数的打包位置。例如min函数:

octave:22> which min
Run Code Online (Sandbox Code Playgroud)

min 是文件C:\ Octave \ Octave3.6.2_gcc4.6.2 \ lib \ octave \ 3.6.2 \ oct \ i686-pc-mingw32 \ max.oct中的函数