您现在的位置是:首页 > 正文

win系统下64位Julia链接fortran的方法

2024-02-01 05:51:55阅读 2

声明:综合网络上各位大佬的方法,实现了在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文件夹下对应的DebugRelease文件夹下面。

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)

[5] Fortran源程序生成动态链接库-百度经验 (baidu.com)

网站文章

  • 堆

    一.堆的定义堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。二.API设计三.代码实现public class Heap<T extends Comparable...

    2024-02-01 05:51:26
  • 你的网卡真有千兆么?——千兆网卡传输速度解析 热门推荐

    随着PS3it技术的破解和可以利用电脑FTP向PS3传送文件,千兆网卡成为了不少玩家必备的工具。要知道PS3it技术本身自带千兆网卡,如果利用FTP软件以及电脑上的千兆网卡进行文件传输,其速度远比采用...

    2024-02-01 05:51:19
  • JavaScript Equality Table

    JavaScript Equality Table

    Tables displaying the issue: and == Moral of the story use ===

    2024-02-01 05:51:13
  • Autoware pure_pursuit节点适配差速底盘

    Autoware pure_pursuit节点适配差速底盘

    Autoware pure_pursuit节点输出的话题是 "/twist_raw", 需要转换为我们小车底盘控制速度的话题,我这里直接用"/cmd_vel"。主要任务是消息格式的转换,下面详细介绍。...

    2024-02-01 05:50:44
  • 调用API

    3.编写API请求:编写代码向API发送请求,包括所需参数和API密钥等。使用最常见的请求方法是HTTP请求,包括GET、POST、PUT、DELETE等。4.解析API响应:API会返回响应数据,需...

    2024-02-01 05:50:30
  • Codeforces 1221E. Game With String

    传送门首先每一段连续的 $...$ 都是互不影响的,所以可以一段段考虑考虑最简单的情况,此时每一段都大于等于 $a$ 并且小于 $2b$ ,那么每一段都只能放一次,胜负直接根据段数即可得到答案考虑如果存在段长小于 $a$ 却大于等于 $b$ 的情况,此时后手可以随时放在那个位置,当然也可以不放,这样胜负就被掌握在后手手里(他可以随时选择交换先后手)所以对于上面那一种情况,...

    2024-02-01 05:50:23
  • spring boot 整合sharding jdbc 遇到的一些问题以及实例源码

    spring boot 整合sharding jdbc 遇到的一些问题以及实例源码

    文章目录一、整合1.pom.xml 新增依赖(这里默认你项目中已经有了Mysql的依赖)2.配置3.遇到的问题“The bean 'dataSource', defined in class path...

    2024-02-01 05:49:55
  • mysqld_safe Directory &#39;/var/lib/mysql&#39; for UNIX socket file don&#39;t exists

    原因:mysql找不着socket文件。 解决办法: 1、修改mysql配置文件my.cnf中[mysqld]下的socket配置项。效果如下。 [mysqld] socket = /tmp/mysql.sock 2、终极解决办法:重启服务器。 ...

    2024-02-01 05:49:47
  • 洛谷 P1618

    https://www.luogu.org/problemnew/show/P1618 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。 //感谢黄小U饮品完善题意 输入输出格式 输入格式: 三个数,A B C。 输出格式: 若干行,每行3个数字。按照每...

    2024-02-01 05:49:41
  • 设计模式之责任链模式

    设计模式之责任链模式

    不同级别的权限检查由不同的权限处理者来执行,如果某个处理者无法处理权限请求,则请求将被传递给下一个处理者。让我们想象一个问题解决系统,根据问题的复杂程度,系统中的不同专家级别的工程师会负责处理不同级别...

    2024-02-01 05:49:13