首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Octave:如何为mkoctfile指定参数

Octave:如何为mkoctfile指定参数
EN

Stack Overflow用户
提问于 2019-09-13 13:17:46
回答 3查看 444关注 0票数 1

我正在使用windows下的octave (本机),并尝试将c++程序编译成一个mex文件,并将一些库链接到它:

代码语言:javascript
复制
% 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);

运行时,命令的输出为:

代码语言:javascript
复制
>> 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

我还试图直接从命令行运行字符串:

代码语言:javascript
复制
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(),但是结果仍然相同:

代码语言:javascript
复制
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{:});

给出输出:

代码语言:javascript
复制
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

结果和以前一样。其他意见如下:

  • '/‘或'\’没有什么区别
  • 如果省略所有参数,则会出现一个丢失的--包括-file-错误: OK
  • 如果省略'-L‘参数,就会得到一个丢失的库文件错误: OK
  • 如果我添加' -L‘参数,就会得到上面显示的错误:-L参数的行为似乎与-I参数不同。

我还直接从bash中使用相应的命令进行了尝试,得到了相同的结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-24 14:43:16

如果参数包含空格,mkoctfile就不会正确地逃避这些参数,而且它不喜欢在Octave自己的路径中使用反斜杠。它创建以下两个命令:

代码语言:javascript
复制
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..."
代码语言:javascript
复制
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 

它将无错误地编译。

票数 1
EN

Stack Overflow用户

发布于 2019-09-13 14:49:47

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

代码语言:javascript
复制
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'

代码语言:javascript
复制
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')
票数 1
EN

Stack Overflow用户

发布于 2019-09-13 15:06:54

这不能回答如何修复它,就像rahnema1 already did that一样。但我将向您展示如何简化代码。

  1. 不要使用eval is evil。 与其计算字符串function paramA paramB,不如直接使用字符串输入参数调用functionfunction paramA paramB由解释器翻译为调用function('paramA','paramB')。但是生成后一种形式要容易得多,您可以避免使用eval来引导: params = {};params{1} = '-IC:/Program (x86)/IVI Foundation/VISA/Winnt/Include‘;params{2} = '-LC:/Program (x86)/IVI Foundation/VISA/Winnt/lib_x64/msc’;params{2} = '-lvisa64.lib';mex('main.cpp',params{:});
  2. 正确地使用fullfile生成路径。它增加了/\,这取决于您在哪个平台上,而且我觉得阅读起来更容易: include_path =fullfile(getenv(‘VXIPNPPATH),'Winnt','Include');params{1} = '-I',include_path;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57924381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档