Octave:如何为 mkoctfile 指定参数
Octave: how to specify arguments for mkoctfile
我正在 windows(本机)下使用 Octave,并尝试将 C++ 程序编译成 mex 文件和 link 一些库:
% 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
这与之前的结果相同。其他观察结果是:
- '/' 或 '\' 没有区别
- 如果我省略所有参数,我会得到一个 missing-include-file-error: OK
- 如果我省略“-L”参数,我会得到一个缺少库文件的错误:OK
- 如果我添加“-L”参数,我会收到如上所示的错误:似乎 -L 参数的行为与 -I 参数不同。
我也直接从bashshell用相应的命令试了下,结果一样。
用斜杠替换反斜杠并将每个参数放在单引号内。
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'
或
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
。 eval
is evil.
不是计算字符串 function paramA paramB
,而是直接使用字符串输入参数调用 function
。 function paramA paramB
由解释器翻译为调用 function('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('VXIPNPPATH'), 'Winnt', 'Include');
params{1} = ['-I', include_path];
如果参数包含空格,mkoctfile
不会正确转义参数,并且它不喜欢 Octave 自己的路径中的反斜杠。
它创建以下两个命令:
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.1.0 -LC:\Octave\OCTAVE~1.0\mingw64\lib -LC:\Octave\OCTAVE~1.0\mingw64\lib\octave.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..."
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
编译成功。
我正在 windows(本机)下使用 Octave,并尝试将 C++ 程序编译成 mex 文件和 link 一些库:
% 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
这与之前的结果相同。其他观察结果是:
- '/' 或 '\' 没有区别
- 如果我省略所有参数,我会得到一个 missing-include-file-error: OK
- 如果我省略“-L”参数,我会得到一个缺少库文件的错误:OK
- 如果我添加“-L”参数,我会收到如上所示的错误:似乎 -L 参数的行为与 -I 参数不同。
我也直接从bashshell用相应的命令试了下,结果一样。
用斜杠替换反斜杠并将每个参数放在单引号内。
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'
或
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
。eval
is evil.不是计算字符串
function paramA paramB
,而是直接使用字符串输入参数调用function
。function paramA paramB
由解释器翻译为调用function('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('VXIPNPPATH'), 'Winnt', 'Include'); params{1} = ['-I', include_path];
mkoctfile
不会正确转义参数,并且它不喜欢 Octave 自己的路径中的反斜杠。
它创建以下两个命令:
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.1.0 -LC:\Octave\OCTAVE~1.0\mingw64\lib -LC:\Octave\OCTAVE~1.0\mingw64\lib\octave.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..."
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
编译成功。