我在我自己的模块上使用GNU gfortran编译器(在Cygwin上).一个很好的例子将有希望从编译阶段开始,解决损坏的名称并从Julia中调用子例程ccall
.我见过的大多数例子都跳过前两个阶段.
所以想象一下,我在Fortran 90文件中有以下模块名为'f90tojl.f90':
module m
contains
integer function five()
five = 5
end function five
end module m
Run Code Online (Sandbox Code Playgroud)
这个例子来自这里.我用gfortran编译它如下创建一个共享库:
gfortran -shared -O2 f90tojl.f90 -o -fPIC f90tojl.so
Run Code Online (Sandbox Code Playgroud)
而且,通过阅读朱莉娅文档,我的,理所当然的不稳定的理解表明,我应该能够像这样调用函数五:
ccall( (:__m_MOD_five, "f90tojl"), Int, () )
Run Code Online (Sandbox Code Playgroud)
它对我不起作用.我得到'error compiling anonymous: could not load module f90tojl...
.有人关心开导我吗?我有一种偷偷摸摸的感觉,我正在做些傻事......
在官方文档中,重点是C.我也知道C++ 的这个.在R和Python中,动力 - 我想到了Cython和Rcpp--似乎是C/C++.与此问题类似,我想了解使用C/C++将Julia与Fortran与Julia联系起来是多么容易.
正如文档所述,调用Fortran和C基本相同.我想,只有很少的例子,因为人们想要包装的代码要少得多.在Julia,包裹C非常容易,非常愉快.它通常不是为了加速Julia,就像使用R或Python一样,但更多的是利用已编写的高质量代码.
Julia的标准库本身是用Fortran代码整合的一个很好的例子,比如这里是朱莉娅包装的ARPARK.之外Base
,glmnet是Fortran语言编写的,并有一个朱莉娅包装它(GLMNet.jl) .
我不知道现代Fortran的区别如何重要.
对于那些像我一样希望通过复制粘贴秘方来解决问题的人来说,这里有一个工作代码(来自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
Run Code Online (Sandbox Code Playgroud)
必须使用 进行编译
gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC
,生成simplemodule.so
共享库文件。
然后,在朱莉娅那里,
a = Int32[3]
ccall((:__simplemodule_MOD_foo, "./simplemodule.so"), Int32, (Ptr{Int32},), a)
Run Code Online (Sandbox Code Playgroud)
返回6
。
该线程还包含其他示例。