Fortran与C/C++的混合开发。。。

简介:
最近在把一个Fortran的程序封成模块整合进一个C++的平台中。平生第一次做fortran,也算是第一次正二八经的做二进制的混合开发。简单写一些,算为前一段工作做个总结。。。
Fortran90与C++的整合,可以基于静态链接。就是都生成obj,然后link在一起。当然也可以是动态链接的,把Fortran打成dll,然 后在C++中调用(windows下...)。当然,这都不会是本质性的问题,你可以根据需求自行抉择。在不同二进制模块中互调,更为关键的是ABI。说 英文的和说中文的总不能和谐的打成一片,要在一块玩就需要一些共同的语言。。。
Calling Conventions在这里显得很重要。首先就是Naming conventions,Fortran和C++的函数名解析往往是不一样的。同样你取名叫functionA的,在C++里面(extern "C")编译完了可能叫functionA_,可到了fortran里,可能会叫_functionA@4。当然,这个问题并不可怕,查一下编译器的手 册,此问题即可迎刃而解。。。
然后是Stack considerations的问题,也就是说函数栈是由调用方管理还是被调用方管理,有兴趣的可以看下 这里 ,同时在fortran中,参数的默认传递方式不同,它默认通过传址来进行传递,这一点需要注意。。。
最后,最麻烦的问题是Argument passing protocol,一个fortran的数据在C++中应该怎么表示呢?基本数据类型这都还好,但数组呢?自定义数据类型呢?在高层一些的语言里,我们根 据串行化的方式,自动将参数序列化和反序列化进行数据转换,一切都比较水到渠成。但基于二进制的接口,调用的基础只是栈的完全匹配,一点点差池对会缪之千 里。在fortran里,数组是列优先的,这正与C++相反,需要注意。而更恶心的是,fortran的数组及其强大,可以从任何脚标起,其间隔可以是任 意的,于是乎在intel的编译器下,一个普通的一维数组的指针,需要占用32个字节的空间。所有这些,都导致参数的传递在此类开发中成为最脆弱的环节。 它们彼此只是靠着栈中信息的一致性依偎在一起,一点点编译器的改动(或者用了一个其他的编译器...),或者是两边程序数据结构的改动(对于自定义类型而 言...),都可能导致崩溃性的后果。解决这个问题,需要依靠在设计层面上解决。需要传递复杂结构的接口都不要用,用一系列方法的调用来替代单一的方法, 将简单的数据依赖转换成为接口定义的依赖。因为基本数据类型总是像黄金一样坚挺,而复杂类型数据的解析总是像股票那般不靠谱。所以我们的原则是,只选简 单,不选复杂。。。
当你做这样一件工作的时候,官方的手册和示例代码是你最好的帮手,而不要简单的依靠问人或Google一下来解决问题。因为别人涉及到的问题可能和你的不 完全一致,而一点点不一样可能就使得结果差的很远了。这也体现出一个人解决一个新的问题的方法了。对我而言,我会把所有可能用到的手段和所需的资料都罗列 一下,尽可能的详尽些。然后依照是绕过问题还是直面问题的差别分成两类,先考虑绕过。如果觉得代价可接受,也可以一劳永逸的话,那么先绕过再说,因为毕竟 是一个新问题,解决和绕过相比通常是难度更大。如果不能绕过,那么就将你所有的手段按照可靠性排个序,通常,源码总是比文档可靠,而文档有总比搜来的资料 可靠。如果一样可靠度的手段,就需要考虑一下它们实施的简单程度了,比如读文档(日文文档除外,我已经被恶心够呛了...)也许会比看源码简单一些,那么 先看看文档再说。总之,我个人觉得可靠度比简单性总会更重要一些,如果一些手段,比如从网上简单搜来的方法,你觉得不可靠,那么就不要先实施,往往是绕了 半天,你发现你又回到了原点。。。









本文转自 duguguiyu 51CTO博客,原文链接:http://blog.51cto.com/duguguiyu/362243,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
47 3
WK
|
17天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
38 1
|
1月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
68 7
WK
|
16天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
31 0
WK
|
17天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
20 0
|
1月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
2月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
130 1
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
147 2
|
4月前
|
NoSQL API Redis
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址