主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

<library>Initialize[WithHandlers]

初始化与 library 关联的 MATLAB Runtime 实例

说明

bool libraryInitialize() 使用默认的打印和错误处理程序创建与生成的 C/C++ 共享库 library 关联的 MATLAB® Runtime 实例。

在调用 mclInitializeApplication 之后,并且在调用库导出的任何编译函数之前,在 C/C++ 应用程序中调用此函数。

示例

bool libraryInitializeWithHandlers(mclOutputHandlerFcn error_handler, mclOutputHandlerFcn print_handler) 创建一个与 library 关联的 MATLAB Runtime 实例,并允许您指定函数来处理错误消息和打印文本。传递给 libraryInitializeWithHandlers 函数安装在 MATLAB Runtime 实例中,并在输出错误文本或常规文本时调用。

示例

bool libraryInitializeWithKey(const char* session_key) 创建一个与 library 关联的 MATLAB Runtime 实例,并允许您指定十六进制编码的 64 字节 AES 解密密钥。该语法允许用户在运行时使用 C++ API 而不是 MEX 加载程序提供解密密钥。有关详细信息,请参阅 mcc -k

示例

bool libraryInitializeWithHandlersAndKey(mclOutputHandlerFcn error_handler, mclOutputHandlerFcn print_handler, const char* session_key) 创建一个与 library 关联的 MATLAB Runtime 实例,并允许您指定错误处理程序、打印处理程序和十六进制编码的 AES 解密密钥。

示例

示例

全部折叠

初始化与名为 libtriangle 的 C/C++ 库关联的 MATLAB Runtime 实例。

在 C 应用程序代码的主函数中调用 C 库 libtriangle 的初始化函数。

if (!libtriangleInitialize())
{
    fprintf(stderr, 
            "An error occurred while initializing: \n %s ",
            mclGetLastErrorMessage());
    return -2;
}

如果初始化失败,则会将错误消息打印到标准错误。

默认情况下,使用 MATLAB Compiler SDK™ 生成的应用程序和共享库将打印输出发送到标准输出,并将错误消息到标准错误。要改变这种行为,请编写自己的错误和打印处理程序并将它们传递给 libraryInitializeWithHandlers。要使用默认处理程序,请传入 mclDefaultPrintHandlermclDefaultPrintHandler

有关完整示例,请参阅位于 matlabroot\extern\examples\compilersdk\c_cpp\catcherror 的文件。

在您的 C/C++ 应用程序中编写自定义打印处理程序函数。此示例代码用 C 编写,并使用两个辅助函数 StartMatlabOutputEndMatlabOutput 将横幅环绕在打印输出周围。

static int PrintHandler(const char *s)
{
    /* Declare and initialize all variables */
    int len = 0;
    const char * prefix = "* ";
    int written = 0;

    if (s == NULL)
    {
        return 0;
    }

    len = strlen(s);

    /* DISP adds two carriage returns. Suppress the last one. */
    if (len >= 2 && s[len-1] == '\n' && s[len-2] == '\n')
    {
        len = len-1;
    }
    
    if (emitPrefix)
    {
        fwrite(prefix, sizeof(char), strlen(prefix), stdout);
    }
    
    written = fwrite(s, sizeof(char), len, stdout);

    if (s[len-1] == '\n')
    {
        emitPrefix = true;
    }
    else
    {
        emitPrefix = false;
    }

    return written;
}

static void StartMatlabOutput()
{
    const char *startBanner = "******** Start MATLAB output *******\n";
    emitPrefix = false;
    PrintHandler(startBanner);
}

static void EndMatlabOutput()
{
    const char *endBanner = "********* End MATLAB output ********\n";
    emitPrefix = false;
    PrintHandler(endBanner);
}

编写自定义错误处理函数。

static char LastError[2048];

static int ErrorHandler(const char *s)
{
    int len = 0;
    len = strlen(s);
    LastError[0] = '\0';
    strcpy(LastError, s);
    return len+1;
}

在您的主函数中,初始化变量后,将打印和错误处理程序传递给 libraryInitializeWithHandlers 函数。

if (!libcatcherrorInitializeWithHandlers(ErrorHandler, PrintHandler))
{
    fprintf(stderr,"Could not initialize the library.\n");
    return -2;
}
else
{
    /* Call the library function. */
    if (mlfRealacos(1, &out, in1))
    {
        /* Display the return value of the library function */
        printf("realacos(%6.4f) = \n", in1val);
        StartMatlabOutput();
        mlfReveal(out);
        EndMatlabOutput();
    }
    else
    {
        printf("Disaster! An unexpected error occurred.\n");
        printf("Error:\n%s\n", LastError);
    }

    /* Call the library termination routine */
    libcatcherrorTerminate();
        
    /* Free the memory allocated for the input variables. */
    mxDestroyArray(in1); 
    in1 = 0;
    mxDestroyArray(in2); 
    in2 = 0;
}

作为在编译时提供 MEX 加载程序文件的替代方法,您可以使用 libraryInitializeWithKey 函数在 C++ 应用程序中指定解密密钥。

获取 AES 加密密钥。例如,您可以在命令行使用 openssl 生成密钥。

openssl rand -hex 64 -out appkey.key

使用 mcc 创建 C++ 共享库。使用 -k 选项指定您生成的加密密钥。有关详细信息,请参阅 mcc -k

 mcc -W cpplib:libappwithkey appwithkey.m -k 'file=appkey.key'

在 C++ 应用程序的主函数中,检索解密密钥。例如,您可以从 AWS® CloudHSM 集群中检索密钥。将十六进制编码的密钥作为初始化函数 libappwithkeyInitializeWithKey 的参量传入。

if (!mclInitializeApplication(NULL, 0))
    {
        printf("Failed to initialize application.\n");
        return -1;
    }

    /* Retrieve the decryption key. */
    ...
    
    if (!libappwithkeyInitializeWithKey(“<key_value>”)) 
    {
        printf("Failed to initialize libappwithkey.\n");
        return -2;
    }
else
{
    /* Call the library function. */
    ...
}

如果初始化失败,则会将错误消息打印到标准错误。

输入参数

全部折叠

库名称,指定为函数名称的一部分。该库必须是 MATLAB Compiler SDK 生成的 C/C++ 共享库。

示例: libmatrix

错误处理程序函数,指定为自定义的用户编写函数或 mclDefaultErrorHandler。该函数必须接受一个字符串并返回打印的字符数。有关详细信息,请参阅打印和错误处理函数

示例: myErrorHandler

打印处理程序函数,指定为自定义的用户编写函数或 mclDefaultPrintHandler。该函数必须接受一个字符串并返回打印的字符数。如果发送到标准错误输出流的字符串没有以回车符结尾,则该函数必须添加一个。有关详细信息,请参阅打印和错误处理函数

示例: myPrintHandler

AES 解密密钥,指定为具有 64 个字符文件大小的十六进制编码 AES 密钥。

有关详细信息,请参阅 mcc -k

示例: mykey.txt

输出参量

全部折叠

初始化结果,以布尔值形式返回。结果表明 mcli 初始化是否成功。如果函数返回 false,则调用任何已编译的函数都会导致不可预测的行为。

版本历史记录

在 R2009a 中推出