A.1.1开始使用Oct文件

Oct文件是用Octave API编译成动态可加载对象的C++代码。它们的名称取自包含扩展名为.oct的对象的文件.

找到一个C++编译器,使用正确的开关,为头文件添加正确的includepath等是一项艰巨的任务。Octave通过提供mkoctfile用于构建oct文件的命令。该命令可在Octave中或shell命令行中使用。

 
: mkoctfile [-options] file …
: [output, status] = mkoctfile (…)

这里的mkoctfile函数编译用C、C++或Fortran编写的源代码。取决于与mkoctfile一起使用的参数,编译后的代码可以在Octave中调用,也可以用作独立的应用程序。

mkoctfile可以从shell命令或Octave命令中调用。如果从Octave命令调用,那么只是将调用委托给shell命令。如果在没有输出的情况下调用,任何输出都存储在output变量和退出状态status变量中,并且会编译失败,Octave将报错。然而,如果程序在outputstatus中报错,Octave只会报警告,程序员有责任验证命令是否成功。

mkoctfile接受以下参数,除要编译的代码的文件名外,所有参数都是可选的:

-I DIR

添加include目录DIR以编译命令。

-D DEF

将定义DEF添加到编译器调用中。

广告
-l LIB

将库LIB添加到链接命令中。

广告
-L DIR

将库目录DIR添加到链接命令中。

广告
-M
--depend

为C和C++源文件生成依赖文件(.d)。

广告
-R DIR

将运行时路径添加到链接命令。

广告
-Wl,…

将参数传递到链接器,如“-Wl,-rpath=…”。因为逗号被解释为命令分隔符,因此需要引号。

广告
-W…

将参数传递给汇编程序,如“-Wa,OPTION”。

广告
-c

编译但不链接。

广告
-g

为编译器启用调试参数。

广告
-o FILE
--output FILE

输出文件名。默认扩展名为.oct.mex如果--mex),除非链接独立的可执行文件。

广告
-p VAR
--print VAR

打印配置变量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_HOMEOCTAVE_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
广告
--link-stand-alone

链接一个独立的可执行文件。

广告
--mex

假设创建了一个MEX文件。将默认输出扩展名设置为.mex. 这将链接到liboctmex而不是liboctinterp和liboctave.

广告
-s
--strip

剥离输出文件。

广告
-v
--verbose

执行命令时回显命令。

广告
file

要编译或链接的文件。可识别的文件类型包括:

   .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 其创建动态加载的函数。此宏包含四个参数:

  1. 函数名称将在Octave中看到,
  2. 类型的函数的参数列表octave_value_list,
  3. 输出参数的数量,如果不使用,可以省略,而且经常省略,以及
  4. 用于函数的帮助文本的字符串。

用定义的函数的返回类型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