【发布时间】:2010-02-17 12:59:08
【问题描述】:
我在 matlab 中使用 dll fortran 时遇到问题。 我无法在matlab中使用由fortran构建的dll。我在 matlab 中使用“loadlibrary”指令,但错误与头文件有关。 什么是头文件?? 请给我更多信息以在 matlab 中加载 dll fortran 并调用它。
【问题讨论】:
标签: matlab dll shared-libraries fortran loadlibrary
我在 matlab 中使用 dll fortran 时遇到问题。 我无法在matlab中使用由fortran构建的dll。我在 matlab 中使用“loadlibrary”指令,但错误与头文件有关。 什么是头文件?? 请给我更多信息以在 matlab 中加载 dll fortran 并调用它。
【问题讨论】:
标签: matlab dll shared-libraries fortran loadlibrary
与其尝试直接使用 dll 文件,我建议您使用 Matlab 的 MEX 功能重新构建它。是的,mex 文件是一个 dll,您可以在 Matlab 之外构建 dll 并成功使用它们,对于像我猜你这样的初学者来说,使用 MEX 会容易得多。一种更简单的方法是,如果您构建一个 mex 文件,系统不会要求您提供头文件,如您所知,这对于 Fortran 程序员来说是一个相当陌生的概念。 MEX 让您的生活更轻松的另一种方法是,您可以直接从 Matlab 的命令行调用 dll 公开的函数,而无需加载库。
研究MEX文件的Matlab文档,特别注意如何以这种方式集成Fortran。
【讨论】:
如果没有看到您在 MATLAB 中使用的头文件和命令行,这里很难为您提供太多帮助。你可能会reference the documentation in MATLAB which request that you pass two arguments to loadlibrary,第二个是带有函数签名的头文件。我猜你没有提供第二个参数。
【讨论】:
您需要提供一个头文件,该文件定义您将调用的 Fortran DLL 中的每个命名函数。例如,如果您的 DLL 包含一个名为 sum 的函数,该函数将两个双精度变量相加,例如:
function sum(a,b) result(sum)
real(kind=2), intent(in) :: a, b
real(kind=2) :: sum
sum = a + b
end function
那么您的标题将需要包含以下内容:
double sum(double*a, double*b);
但不要忘记使用特定于 Fortran 编译器的名称修饰来装饰它。例如,如果 sum 在名为 foo 的模块中,并且您使用 gfortran 进行编译,那么您将需要类似以下内容:
double __foo_MOD_sum(double*a, double*b);
还有很多其他的案例,但这就是它的要点。
【讨论】: