我在我自己的模块上使用GNU gfortran编译器(在Cygwin上)。一个很好的例子将有希望从编译阶段开始,解决受损的名称并通过ccall
从Julia调用子例程。我见过的大多数例子都跳过了前两个阶段。
想象一下,我在Fortran 90文件中有以下模块名为' f90tojl.f90':
module m
contains
integer function five()
five = 5
end function five
end module m
此示例来自here。我用gfortran编译它如下创建一个共享库:
gfortran -shared -O2 f90tojl.f90 -o -fPIC f90tojl.so
而且,通过阅读朱莉娅文档,我的理解是不稳定的理解,这表明我应该能够像这样调用函数五:
ccall( (:__m_MOD_five, "f90tojl"), Int, () )
它对我不起作用。我得到'error compiling anonymous: could not load module f90tojl...
。有人关心开导我吗?我有一种狡猾的感觉,我做了些傻事......
在官方doc中,重点是C.我也知道C ++的this。在R和Python中,动力 - 我想到了Cython和Rcpp--似乎是C / C ++。与此question类似,我想了解使用C / C ++将Julia与Fortran与Julia联系起来是多么容易。
答案 0 :(得分:8)
文档说,调用Fortran和C基本相同。我想,只有很少的例子,因为人们想要包装的代码要少得多。在Julia,包裹C非常容易,非常愉快。它通常不是为了加速Julia,就像使用R或Python一样,但更多的是利用已经编写的高质量代码。
Julia的标准库本身就是与Fortran代码集成的一个很好的例子,例如:这是Julia wrapper的ARPARK。在Base
之外,glmnet是用Fortran编写的,有一个Julia wrapper for it (GLMNet.jl)。
我不知道现代Fortran的区别如何。
答案 1 :(得分:1)
对于那些像我一样希望通过复制粘贴食谱来解决此问题的人,这里有一个有效的代码(经http://julia-programming-language.2336112.n4.nabble.com/example-for-ccall-use-and-fortran-tp7737p7740.html改正了笔录)。
Fortran文件:simplemodule.f95
module simpleModule
contains
function foo(x)
integer :: foo, x
foo = x * 2
end function foo
end module simplemodule
必须与哪个编译
gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC
,生成simplemodule.so
共享库文件。
然后用朱莉娅
a = Int32[3]
ccall((:__simplemodule_MOD_foo, "./simplemodule.so"), Int32, (Ptr{Int32},), a)
返回6
。
thread也包含其他示例。