如何在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
相关产品推荐
相关产品推荐

