关于这个主题的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复制到分发目录来简化此步骤,尽管这样做会有些过分,并且实际上不会防止打鼹鼠的步骤.
现在,你必须玩"打包鼹鼠"或"我包括在哪里,哟?"这个历史悠久的传统.
尝试运行嵌入式程序.您将收到如下错误:
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列
一个在八度安装搜索"最大".它将是.oct或.m文件.在这种情况下,它是.oct文件,max.oct.将其复制到您的分发目录.
B你搜索明显像"min"这样的东西,并没有得到任何结果.这是因为可装载功能"min"位于.oct文件"max.oct"中.制作max.oct的副本,并将其重命名为min.oct.它现在可以工作了.你怎么知道这些功能在哪里?我不确定.他们中的大多数都在明显的地方,例如"max.oct"表示min,"fft2.oct"表示"ifft2.oct".祝你好运.
重复直到可执行文件运行.
小智 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中的函数