Octave 八度:如何为mkoctfile指定参数

Octave 八度:如何为mkoctfile指定参数,octave,mex,Octave,Mex,我在Windows(原生)下使用八度表,尝试将C++程序编译成MEX文件,并将一些库链接到: % compile for octave cmd = sprintf("mex main.cpp -I\"%s\\Winnt\\Include\" -L\"%s\\Winnt\\lib_x64\\msc\" -lvisa64.lib", ... getenv('VXIPNPPATH'), getenv('VXIPNPPATH')) eval(cmd); 运行时,命令的输出为: >> mex

我在Windows(原生)下使用八度表,尝试将C++程序编译成MEX文件,并将一些库链接到:
% compile for octave
cmd = sprintf("mex main.cpp -I\"%s\\Winnt\\Include\" -L\"%s\\Winnt\\lib_x64\\msc\" -lvisa64.lib", ...
getenv('VXIPNPPATH'), getenv('VXIPNPPATH'))
eval(cmd);
运行时,命令的输出为:

>> mex main.cpp -I'C:\Program Files (x86)\IVI Foundation\VISA\\Winnt\Include' -L'C:\Program Files (x86)\IVI Foundation\VISA\\Winnt\lib_x64\msc' -lvisa64.lib
g++: error: Files: No such file or directory
g++: error: (x86)\IVI: No such file or directory
g++: error: Foundation\VISA\\Winnt\lib_x64\msc: No such file or directory
warning: mkoctfile: building exited with failure status
我还尝试直接从命令行运行字符串:

mex main.cpp -I'C:\Program Files (x86)\IVI Foundation\VISA\\Winnt\Include' -L'C:\Program Files (x86)\IVI Foundation\VISA\\Winnt\lib_x64\msc' -lvisa64.lib
同样的结果。 虽然-I命令似乎运行良好,但为什么-L参数会导致问题?用空格转义路径名的正确方法是什么? 双引号也不起作用

编辑 根据答案,我使用函数形式的mex(),但结果仍然相同:

vxipath = getenv('VXIPNPPATH');
params={};
params{1} = sprintf('-I%s', fullfile(vxipath, 'Winnt', 'Include'));
params{2} = sprintf('-L%s', fullfile(vxipath, 'Winnt', 'lib_x64', 'msc'));
params{3} = sprintf('-lvisa64.lib');

% replace \ with /
for i1=1:length(params)
  s = params{i1};
  s(s=='\') = '/';
  params{i1} = s;
end

params
mex("main.cpp", params{:});
给出输出:

params =
{
  [1,1] = -IC:/Program Files (x86)/IVI Foundation/VISA/Winnt/Include
  [1,2] = -LC:/Program Files (x86)/IVI Foundation/VISA/Winnt/lib_x64/msc
  [1,3] = -lvisa64.lib
}

g++: error: Files: No such file or directory
g++: error: (x86)/IVI: No such file or directory
g++: error: Foundation/VISA/Winnt/lib_x64/msc: No such file or directory
warning: mkoctfile: building exited with failure status
这与之前的结果相同。其他意见包括:

  • “/”或“\”没有区别
  • 如果省略所有参数,则会得到一个缺少的include文件错误:OK
  • 如果省略'-L'参数,则会得到一个缺少的lib文件错误:OK
  • 如果添加“-L”参数,则会出现上面显示的错误,-L参数的行为似乎与-I参数的行为不同

我还使用相应的命令直接从bash shell中尝试了它,结果相同。

用斜杠替换反斜杠,并将每个参数放在单引号内

mex 'main.cpp' '-IC:/Program Files (x86)/IVI Foundation/VISA//Winnt/Include' '-LC:/Program Files (x86)/IVI Foundation/VISA//Winnt/lib_x64/msc' '-lvisa64.lib'


这并没有解决如何修复它的问题。但我将向您展示如何简化代码

  • 不要使用
    eval

    使用字符串输入参数直接调用
    函数
    ,而不是计算字符串
    函数paramA paramB
    <代码>函数paramA paramB由解释器转换为调用
    函数('paramA','paramB')
    。但是生成后一种形式要容易得多,而且您可以避免
    eval
    启动:

    params={};
    params{1}='-IC:/Program Files(x86)/IVI Foundation/VISA//Winnt/Include';
    params{2}='-LC:/Program Files(x86)/IVI Foundation/VISA//Winnt/lib_x64/msc';
    params{2}='-lvisa64.lib';
    mex('main.cpp',params{:});
    
  • 使用
    fullfile
    正确生成路径。它添加了
    /
    \
    ,具体取决于您所在的平台,而且我发现它更容易阅读:

    include_path=fullfile(getenv('vxipnpath'),'Winnt','include');
    参数{1}=['-I',include_path];
    

  • mkoctfile
    如果参数包含空格且不喜欢八度音阶自身路径中的反斜杠,则无法正确转义参数。 它创建以下两个命令:

    g++ -c -I/release/mxe-octave-w64/usr/x86_64-w64-mingw32/include  -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave\.. -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave -IC:\Octave\OCTAVE~1.0\\mingw64\include   -fopenmp -g -O2   -I. "-IC:\Program Files (x86)\IVI Foundation\VISA\Winnt\Include"  -DMEX_DEBUG main.cpp -o C:\Octave\OCTAVE~1.0\tmp/oct-u4r15I.o
    g++ -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave\.. -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave -IC:\Octave\OCTAVE~1.0\\mingw64\include   -fopenmp -g -O2 -shared -Wl,-rpath-link,/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/qt5/lib -Wl,--export-all-symbols  -o main.mex  C:\Octave\OCTAVE~1.0\tmp/oct-u4r15I.o  -lvisa64.lib  -LC:\Program Files (x86)\IVI Foundation\VISA\Winnt\lib_x64\msc -LC:\Octave\OCTAVE~1.0\\mingw64\lib\octave\5.1.0 -LC:\Octave\OCTAVE~1.0\\mingw64\lib -LC:\Octave\OCTAVE~1.0\\mingw64\lib\octave\5.1.0 -loctinterp -loctave  -Wl,-rpath-link,/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/qt5/lib -Wl,--export-all-symbols 
    
    当我将其更改为以下内容时:

    • \
      替换为
      /
    • 指定不带.lib扩展名的库名称
    • 转义
      -LC:\Program Files…
      “-LC:\Program Files…

    它将编译无误

    fullfile
    不会将\替换为/。同样需要额外的工作
    include\u path(include\u path=='\')='/'@rahnema1:我不知道。Octave对分离器很挑剔吗?我认为MATLAB会在Windows上自动将前斜杠转换为后斜杠,但通常在调用
    mex
    时,您会在Windows上使用反斜杠。Octave最初是为非Windows系统开发的,而Windows的端口是通过交叉编译完成的,因此最终我们可以看到这样的不兼容。这似乎没有什么区别。请看我上面的编辑。这似乎没有什么不同。请参阅我上面的编辑。
    mex(“main.cpp”,params{:})
    。请将
    -v
    (verbose)标志添加到
    mex
    命令中,以便我们可以查看正在执行的链接器命令。我认为八度音阶可能无法正确地脱离shell命令。@CrisLuengo:谢谢-v。这正是问题所在。显然,这个文件在windows下被破坏了。在单独的答案中查看结果。可能会显示实际的
    mex
    调用,我假设您的意思是在字符串中包含
    引号:
    ”“-L…”
    ?第一个框中的两个g++调用就是mex()生成。我需要进行两个更改才能使其正常工作。哦,那么您是在shell中直接执行那些
    g++
    调用吗?是的,在与octave一起安装的bash shell中。
    g++ -c -I/release/mxe-octave-w64/usr/x86_64-w64-mingw32/include  -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave\.. -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave -IC:\Octave\OCTAVE~1.0\\mingw64\include   -fopenmp -g -O2   -I. "-IC:\Program Files (x86)\IVI Foundation\VISA\Winnt\Include"  -DMEX_DEBUG main.cpp -o C:\Octave\OCTAVE~1.0\tmp/oct-u4r15I.o
    g++ -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave\.. -IC:\Octave\OCTAVE~1.0\\mingw64\include\octave-5.1.0\octave -IC:\Octave\OCTAVE~1.0\\mingw64\include   -fopenmp -g -O2 -shared -Wl,-rpath-link,/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/qt5/lib -Wl,--export-all-symbols  -o main.mex  C:\Octave\OCTAVE~1.0\tmp/oct-u4r15I.o  -lvisa64.lib  -LC:\Program Files (x86)\IVI Foundation\VISA\Winnt\lib_x64\msc -LC:\Octave\OCTAVE~1.0\\mingw64\lib\octave\5.1.0 -LC:\Octave\OCTAVE~1.0\\mingw64\lib -LC:\Octave\OCTAVE~1.0\\mingw64\lib\octave\5.1.0 -loctinterp -loctave  -Wl,-rpath-link,/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/qt5/lib -Wl,--export-all-symbols 
    
    g++ -c -I/release/mxe-octave-w64/usr/x86_64-w64-mingw32/include  -IC:/Octave/OCTAVE~1.0//mingw64/include/octave-5.1.0/octave/.. -IC:/Octave/OCTAVE~1.0//mingw64/include/octave-5.1.0/octave -IC:/Octave/OCTAVE~1.0//mingw64/include   -fopenmp -g -O2   -I. "-IC:/Program Files (x86)/IVI Foundation/VISA/Winnt/Include"  -DMEX_DEBUG main.cpp -o C:/Octave/OCTAVE~1.0/tmp/oct-u4r15I.o  
    g++ -IC:/Octave/OCTAVE~1.0//mingw64/include/octave-5.1.0/octave/.. -IC:/Octave/OCTAVE~1.0//mingw64/include/octave-5.1.0/octave -IC:/Octave/OCTAVE~1.0//mingw64/include   -fopenmp -g -O2 -shared -Wl,-rpath-link,/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/qt5/lib -Wl,--export-all-symbols  -o main.mex  C:/Octave/OCTAVE~1.0/tmp/oct-u4r15I.o "-LC:/Program Files (x86)/IVI Foundation/VISA/Winnt/lib_x64/msc" -lvisa64 -LC:/Octave/OCTAVE~1.0//mingw64/lib/octave/5.1.0 -LC:/Octave/OCTAVE~1.0//mingw64/lib -LC:/Octave/OCTAVE~1.0//mingw64/lib/octave/5.1.0 -loctinterp -loctave  -Wl,-rpath-link,/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/lib -L/release/mxe-octave-w64/usr/x86_64-w64-mingw32/qt5/lib -Wl,--export-all-symbols