web-dev-qa-db-ja.com

Octaveをインストールせずに配布可能な単純なOctaveを作成するにはどうすればよいですか?

このテーマに関するOctaveのドキュメントは、威圧的でまばらです。

見つけた解決策を他にどこに文書化するかわからなかったので、ここに投稿します。それが不適切な場合はお詫びしますが、次の人を助けたいと思います。

次の解決策は、配布可能な単純なウィンドウ用です。

ユースケース:
ソリューションはOctave3.2.4で開発されており、コンピュータースキルがほとんどないエンドユーザーに配布する必要があります。 Octaveをインストールして説明することは不可能です。解決策は、「ワンクリック」または「脳死」でなければなりません。

既知の問題:
file_in_path.mが間違っているため、3.2.4でimreadが失敗します。ファイル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=[]; 
21
Noah

解決策: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;
}

コマンドを使用してこのファイルをビルドします

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

警告をスローする場合がありますが、エラーをスローしない限り、問題はありません。ファイル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を実行してみます。次のようなエラーが発生します。

    embedded.exe
    エラー: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. [〜#〜] a [〜#〜]Octaveインストールで「max」を検索します。 .octまたは.mファイルのいずれかになります。この場合、それは.octファイル、max.octです。配布ディレクトリにコピーします。

    [〜#〜] b [〜#〜]「min」のような明らかなものを検索しても、結果は得られません。これは、ロード可能な関数「min」が.octファイル「max.oct」にあるためです。 max.octのコピーを作成し、名前をmin.octに変更します。これで動作します。関数がどこにあるかをどうやって知るのですか?よく分かりません。それらのほとんどは、minの「max.oct」や「ifft2.oct」の「fft2.oct」などの明らかな場所にあります。それで頑張ってください。

  5. 実行可能ファイルが実行されるまで繰り返します。

11
ronalchn

M関数の代わりにスクリプトを実行する場合は、embedded.ccの行を追加します。

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

する必要があります:

octave_value_list out = feval ("your_custom_m_script");

また、「which」を使用して、不足している関数がパックされている場所を見つけます。たとえば、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の関数です。

5
user1961742

上記の箇条書き4Bの解決策では、次のようになります。

B「min」のような明らかなものを検索しても、結果が得られません。これは、ロード可能な関数「min」が.octファイル「max.oct」にあるためです。 max.octのコピーを作成し、名前をmin.octに変更します。これで動作します。

@folder function.mから​​関数が呼び出されている場合、これは機能しない可能性があります。また、不要な重複ファイルを回避するには、@ folderの外部のmファイルのどこかに次のコードを追加するだけです。

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

同様に、それは経由で削除することができます

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

Max.octへのパスがここに提供されていることを確認してください。

上記の理解は、\ Octave-4.0.1\lib\octave\packages\communication-1.2.1\i686-w64-mingw32-api-v50 + \にある通信パッケージ内のファイルPKG_ADDおよびPKG_DELに基づいています。

1
Tilak

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

バッチファイルからではなく、オクターブソリューションから。

ちょうど半日あなたを救った(-;

1
bad programer

カスタムmファイルをOctaveスタンドアロンにリンクするときに見つけたもの:

  1. 必要_#include <octave/toplev.h>_
  2. _return 0;_(上記のように)をclean_up_and_exit(0);に置き換えます

これらの手順がないと、プログラムは終了時に繰り返しクラッシュしました。

1
Melissa Jones

チェックアウト Stratego Octaveコンパイラ

(まだテストしていませんが、数日中にテストする予定です。)

0

私はそれとまったく同じ要件(ワンクリック、brain-dead-simple)を持っていたので、curl.exe、以下のバッチファイル、変装した.batであるexe(単にバッチファイルを呼び出す)のみを含むセットアップを行いました以下)および以下の.vbsスクリプト(私が作成したものではありません)。そしてもちろん私のmファイル。

これにより、Octave 4.2.1がポータブルプログラムとしてダウンロードされ(32ビット、そうでない場合はシステムが32ビットであることが判明した場合は再度ダウンロードする必要があります)、vbsスクリプトを使用して解凍し、内容をバッチと同じフォルダーに移動しますファイルを作成し、GUIモードで実行します。次回同じスクリプトが呼び出されるたびに、octave.batがまだ存在するかどうかのみがチェックされます。

もちろん、これはディスクスペースの膨大な浪費につながり、280MBのZipをダウンロードします。これは1GB以上に解凍され(後で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
HJW