Oct文件是用Octave API编译成动态可加载对象的C++代码。它们的名称取自包含扩展名为.oct的对象的文件.
找到一个C++编译器,使用正确的开关,为头文件添加正确的includepath等是一项艰巨的任务。Octave通过提供mkoctfile
用于构建oct文件的命令。该命令可在Octave中或shell命令行中使用。
[-options] file …
¶[output, status] =
mkoctfile (…)
¶这里的mkoctfile
函数编译用C、C++或Fortran编写的源代码。取决于与mkoctfile
一起使用的参数,编译后的代码可以在Octave中调用,也可以用作独立的应用程序。
mkoctfile
可以从shell命令或Octave命令中调用。如果从Octave命令调用,那么只是将调用委托给shell命令。如果在没有输出的情况下调用,任何输出都存储在output变量和退出状态status变量中,并且会编译失败,Octave将报错。然而,如果程序在output或status中报错,Octave只会报警告,程序员有责任验证命令是否成功。
mkoctfile
接受以下参数,除要编译的代码的文件名外,所有参数都是可选的:
添加include目录DIR以编译命令。
将定义DEF添加到编译器调用中。
将库LIB添加到链接命令中。
将库目录DIR添加到链接命令中。
为C和C++源文件生成依赖文件(.d)。
将运行时路径添加到链接命令。
将参数传递到链接器,如“-Wl,-rpath=…”。因为逗号被解释为命令分隔符,因此需要引号。
将参数传递给汇编程序,如“-Wa,OPTION”。
编译但不链接。
为编译器启用调试参数。
输出文件名。默认扩展名为.oct或.mex如果--mex),除非链接独立的可执行文件。
打印配置变量VAR。变量有三类:
用户可以用环境变量覆盖的Octave配置变量。这些用于以下命令mkoctfile
执行。
ALL_CFLAGS INCLUDEDIR ALL_CXXFLAGS LAPACK_LIBS ALL_FFLAGS LDFLAGS ALL_LDFLAGS LD_STATIC_FLAG BLAS_LIBS LIBDIR CC LIBOCTAVE CFLAGS LIBOCTINTERP CPICFLAG LIBOCTMEX CPPFLAGS OCTAVE_LINK_OPTS CXX OCTINCLUDEDIR CXXFLAGS OCTAVE_LIBS CXXLD OCTAVE_LINK_DEPS CXXPICFLAG OCTLIBDIR DL_LDFLAGS OCT_LINK_DEPS F77 OCT_LINK_OPTS F77_INTEGER8_FLAG RDYNAMIC_FLAG FFLAGS SPECIAL_MATH_LIB FPICFLAG XTRA_CFLAGS INCFLAGS XTRA_CXXFLAGS
Octave配置变量如上所述,但当前未使用mkoctfile
.
AR DEPEND_EXTRA_SED_PATTERN DEPEND_FLAGS FFTW3F_LDFLAGS FFTW3F_LIBS FFTW3_LDFLAGS FFTW3_LIBS FFTW_LIBS FLIBS LIBS RANLIB READLINE_LIBS
仅提供Octave配置变量的信息。除了OCTAVE_HOME和OCTAVE_EXEC_HOME,用户不能覆盖这些变量。
如果OCTAVE_HOME
或OCTAVE_EXEC_HOME
在环境中设置,然后使用相应地调整其他变量OCTAVE_HOME
或OCTAVE_EXEC_HOME
替换为指定的目录的原始值--prefix或--exec-prefix配置Octave时使用的参数。
API_VERSION LOCALARCHLIBDIR ARCHLIBDIR LOCALFCNFILEDIR BINDIR LOCALOCTFILEDIR CANONICAL_HOST_TYPE LOCALSTARTUPFILEDIR DATADIR LOCALVERARCHLIBDIR DATAROOTDIR LOCALVERFCNFILEDIR DEFAULT_PAGER LOCALVEROCTFILEDIR EXEC_PREFIX MAN1DIR EXEEXT MAN1EXT FCNFILEDIR MANDIR IMAGEDIR OCTAVE_EXEC_HOME INCLUDEDIR OCTAVE_HOME INFODIR OCTDATADIR INFOFILE OCTDOCDIR LIBDIR OCTFILEDIR LIBEXECDIR OCTFONTSDIR LOCALAPIARCHLIBDIR OCTINCLUDEDIR LOCALAPIFCNFILEDIR OCTLIBDIR LOCALAPIOCTFILEDIR STARTUPFILEDIR LOCALAPIPKGDIR VERSION
链接一个独立的可执行文件。
假设创建了一个MEX文件。将默认输出扩展名设置为.mex. 这将链接到liboctmex而不是liboctinterp和liboctave.
剥离输出文件。
执行命令时回显命令。
要编译或链接的文件。可识别的文件类型包括:
.c C source .cc C++ source .cp C++ source .cpp C++ source .CPP C++ source .cxx C++ source .c++ C++ source .C C++ source .f Fortran source (fixed form) .F Fortran source (fixed form) .f90 Fortran source (free form) .F90 Fortran source (free form) .o object file .a library file
考虑下面的简短示例,它介绍了编写可链接到Octave的C++函数的基本知识。
#include <octave/oct.h> DEFUN_DLD (helloworld, args, nargout, "Hello World Help String") { octave_stdout << "Hello World has " << args.length () << " input arguments and " << nargout << " output arguments.\n"; // Return empty matrices for any outputs octave_value_list retval (nargout); for (int i = 0; i < nargout; i++) retval(i) = octave_value (Matrix ()); return retval; }
第一条关键语句是#include <octave/oct.h>
,这使得C++ oct文件所需的大部分定义可用。请注意octave/oct.h是C++标头,不能直接#include
在C源文件或任何其他语言中。
包含者oct.h是宏的定义DEFUN_DLD
其创建动态加载的函数。此宏包含四个参数:
octave_value_list
,用定义的函数的返回类型DEFUN_DLD
总是octave_value_list
.
在选择函数名称时有几个重要的考虑因素。首先,它必须是一个有效的Octave函数名,因此必须是一系列字母、数字和下划线,而不是以数字开头。其次,当Octave使用函数名来定义它试图在中查找函数的文件名时DEFUN_DLD
宏必须与oct文件的文件名匹配。因此,上述函数应该在一个文件中helloworld.cc,并将使用命令编译为oct文件
mkoctfile helloworld.cc
这将创建一个名为helloworld.oct,这就是函数的可执行文件。需要注意的是,拥有多个DEFUN_DLD
函数是完全可以接受的。但是,对于源代码中定义的每个函数,必须有一个指向oct文件的符号链接DEFUN_DLD
宏或autoload
(Function Files)才能使用函数。
该函数的其余部分显示了如何查找输入参数的数量,如何通过Octave分页器进行打印,以及如何从该函数返回。如上所述编译此函数后,其使用示例如下
helloworld (1, 2, 3) -| Hello World has 3 input arguments and 0 output arguments.
接下来的部分将展示如何使用Octave核心内部的特定类。基类如dMatrix
(double值矩阵)可以在liboctave/array目录中找到。关于如何使用特定类的直接参考来源是头文件本身。然而,为了能够使用一个类,通常只需学习手册中的示例就足够了。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2