You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fortran中调用Matlab生成的动态链接库(共享库)

Fortran调用Matlab生成的C动态库实现神经网络推理

前置确认

  • 仅靠生成的.so动态库不足以完成调用,编译Fortran代码时必须用到.h文件中的C函数声明来完成接口对接,同时还需要链接Matlab的运行时依赖库。

步骤1:解析C接口核心函数

从你提供的.h文件中提取Matlab生成的核心推理函数,通常格式如下(以Matlab标准生成接口为例):

#include "matrix.h"
void bodyfatFcn(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]);

参数说明:

  • nlhs:输出变量的数量
  • plhs:指向输出mxArray数组的指针
  • nrhs:输入变量的数量
  • prhs:指向输入mxArray数组的指针

同时需要用到Matlab提供的mxArray操作函数(来自matrix.h),比如创建矩阵、获取数据指针、释放内存等。

步骤2:编写Fortran的C接口绑定

在test.F90中通过ISO_C_BINDING模块实现Fortran与C函数的对接,处理mxArray不透明类型:

program test_nn
    use, intrinsic :: iso_c_binding
    implicit none

    ! 声明Matlab mxArray为C绑定的不透明类型
    type, bind(C) :: mxArray
    end type mxArray

    ! 对接C函数的Fortran接口
    interface
        ! 核心神经网络推理函数
        subroutine bodyfatFcn(nlhs, plhs, nrhs, prhs) bind(C, name='bodyfatFcn')
            import :: c_int, mxArray
            integer(c_int), value :: nlhs, nrhs
            type(mxArray), pointer :: plhs(:)
            type(mxArray), intent(in), pointer :: prhs(:)
        end subroutine bodyfatFcn

        ! Matlab mxArray操作函数
        type(mxArray), pointer function mxCreateDoubleMatrix(m, n, flag) bind(C, name='mxCreateDoubleMatrix')
            import :: c_int
            integer(c_int), value :: m, n, flag
        end function mxCreateDoubleMatrix

        subroutine mxDestroyArray(pa) bind(C, name='mxDestroyArray')
            import :: mxArray
            type(mxArray), pointer :: pa
        end subroutine mxDestroyArray

        real(c_double), pointer function mxGetPr(pa) bind(C, name='mxGetPr')
            import :: mxArray, c_double
            type(mxArray), pointer :: pa
        end function mxGetPr
    end interface

    ! 自定义维度(替换为你的神经网络实际输入输出维度)
    integer(c_int), parameter :: INPUT_DIM = 10, OUTPUT_DIM = 1
    integer(c_int), parameter :: NLHS = 1, NRHS = 1

    ! 变量声明
    type(mxArray), pointer :: plhs(1), prhs(1)
    real(c_double), pointer :: x_test(:), y_test(:)

    ! 1. 创建输入矩阵并填充测试数据
    prhs(1) => mxCreateDoubleMatrix(INPUT_DIM, 1, 0) ! 0表示实矩阵
    x_test => mxGetPr(prhs(1))
    x_test = [1.0d0, 2.0d0, 3.0d0, 4.0d0, 5.0d0, 6.0d0, 7.0d0, 8.0d0, 9.0d0, 10.0d0]

    ! 2. 调用神经网络推理函数
    call bodyfatFcn(NLHS, plhs, NRHS, prhs)

    ! 3. 获取并打印输出结果
    y_test => mxGetPr(plhs(1))
    print *, "神经网络输出结果:", y_test(1:OUTPUT_DIM)

    ! 4. 释放内存
    call mxDestroyArray(prhs(1))
    call mxDestroyArray(plhs(1))

end program test_nn

步骤3:编写Makefile完成编译

确保Makefile中包含Matlab头文件路径、链接Matlab运行时库和自定义动态库:

# 替换为你的Matlab安装路径
MATLAB_PATH = /usr/local/MATLAB/R2023a
FC = gfortran
CC = gcc
# 编译选项:包含Matlab头文件
CFLAGS = -I$(MATLAB_PATH)/extern/include
FFLAGS = -I$(MATLAB_PATH)/extern/include -fdefault-real-8
# 链接选项:链接自定义库和Matlab运行时库
LDFLAGS = -L$(MATLAB_PATH)/bin/glnxa64 -L./ -lbodyfatFcn -lmx -lmat -lmwmcr -lmwmclmcrrt

test: test.F90
	$(FC) $(FFLAGS) -c test.F90 -o test.o
	$(FC) test.o $(LDFLAGS) -o test

clean:
	rm -f test.o test

运行注意事项

  • 运行前需设置环境变量,让系统能找到动态库:
    export LD_LIBRARY_PATH=./:$(MATLAB_PATH)/bin/glnxa64:$LD_LIBRARY_PATH
    ./test
    
  • 如果你的.h文件包含其他辅助函数,需要在Fortran接口中对应添加声明。

内容的提问来源于stack exchange,提问作者user790082

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:15:48