声明:综合网络上各位大佬的方法,实现了在win系统下64位Julia链接fortran。分步骤参考了大佬们的操作,文末黏贴了参考文献。整合为个人原创,转载请注明出处。相关参考也列在下部。第一次发文,不妥侵删。
1. 创建动态库(注意fortran源代码的特殊声明,以及生成dllx版本要和Julia版本相同,笔者为64位,因此用x64)
2. Julia中用ccall语句
3. Julia中封装ccall
--------------------------------
主要工具:
Win,Julia 1.5.1,VS2019+IVF
具体操作步骤如下:
1. 创建动态库编译环境
首先新建一个空的Fortran Dynamic-link Library项目。在Intel(R) Visual Fortran点击Library,选中右图的Dynamic-link Library.然后点击OK.这时的项目如下所示:
右键Sources File文件夹,添加(add),选择新建项。
添加一个新的Fortran文件。
2. Fortran代码写入
写一个计算两数之和的函数,其中声明语句!DEC$ ATTRIBUTES DLLEXPORT :: 和!DEC$ ATTRIBUTES ALIAS:'MySum'::Mysum非常重要,参考的一个示例代码如下:
function MySum(x,y)
implicit none
!DEC$ ATTRIBUTES DLLEXPORT :: MySum
!DEC$ ATTRIBUTES ALIAS:'MySum'::Mysum
integer x,y,MySum
MySum=x+y
return
end function
3. 生成dll文件
关键操作一步,生成dll文件必须和Julia版本位数相同。若不同会出现如下报错:
ERROR: could not load library "C:\Users\dell\Desktop\test\Dll2\Dll2\Release\Dll2.dll"
%1 is not a valid Win32 application.
关于这个报错解决办法有两种,网络已有解决方法是改装32位Julia。另一种就是生成64位dll库,具体生成方法如下:
首先,用VS打开之前的项目,这时候项目的平台是x86,如下图所示:
点击x86,选择配置管理器--新建--键入或选择新平台,选择x64,其他默认:
选择生成--生成解决方案
编译运行即可生成64位的dll,只不过这次生成的dll不是在系统目录的Debug或者Release文件夹下,而是在一个x64文件夹下对应的Debug和Release文件夹下面。
4. Julia调用
Julia的documentation中给出的语句格式为:
ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...)
参照实例,调用语句为:
ccall((:MySum,"C:\\Users\\dell\\Desktop\\test\\Dll3\\Dll3\\x64\\Release\\Dll3.dll"),Int64,(Ref{Int64},Ref{Int64}),3,4)
第一个参数是一个元组,包含函数名和动态链接库的文件名。函数名为 Symbol 类型。
第二个参数是 Fortran 函数返回值的类型。
第三个参数是 Fortran 函数参数的类型,将所有传入参数的类型放到一个元组内。由于 Fortran 函数是传址调用,此处需要在原本的类型外加上 Ref{}
,调取参数的地址。此例中有两个参数,如果只有一个参数,则需要写成 (Ref{Int64},)
。注意一定要带上逗号,仅仅用括号括起来不能构成一个元组。更多细节请查阅documentation。
最终结果如下:
5. Julia中封装ccall
1-4步基本已经实现了Julia中Fortran的调用。Julia官方建议对调用过程进行封装。该部分Julia 中调用 Fortran - 知乎 (zhihu.com)给出了参考样例,本文不再补充。
致谢:感谢Julia分享群中@一个人,@乱⑺⑧糟的指导建议。
参考文献(非常感谢这些分享,排名不分先后):
[1] Fortran 入门——C#调用Fortran DLL - xxfss2 - 博客园 (cnblogs.com)
[2] 使用VS在64位平台下编译代码,生成64位dll_邓无邪的博客-CSDN博客
[3] Julia 中调用 Fortran - 知乎 (zhihu.com)
[4] C#与Fortran混合编程之本地调用Fortran动态链接库 - Mr|Right - 博客园 (cnblogs.com)