Fortran Coder

标题: Fortran程序中调用C语言程序文件 [打印本页]

作者: zhu_youren    时间: 2015-1-17 17:44
标题: Fortran程序中调用C语言程序文件
本帖最后由 zhu_youren 于 2015-1-17 17:49 编辑

这是一个完整的Fortran程序,里面有一个C语言文件用于字符串处理,调试时提示错误,adBuffer.obj : error LNK2019: 无法解析的外部符号 _PUSHCHARACTERARRAY,该符号在函数 _PUSHCHARACTER 中被引用,无法解析的外部符号其实是在C语言文件中定义的函数。所选平台是VS2012+IVF2013,不知道是平台的问题还是应该设置为动态库或静态库,还是其他什么问题?

C程序.JPG (113.95 KB, 下载次数: 573)

Fortran程序中调用C程序文件

Fortran程序中调用C程序文件

项目类型.JPG (28.6 KB, 下载次数: 563)

选择的是控制台应用程序

选择的是控制台应用程序

src.rar

34.2 KB, 下载次数: 11

程序源码


作者: fcode    时间: 2015-1-17 19:17
VS不允许同一共工程包含多种源代码。

你可以创建两个工程,一个 C 语言工程(只编译,不链接),得到 adStack.obj 文件
一个 Fortran 工程,包含所有 f 文件和 adStack.obj 文件。
作者: zhu_youren    时间: 2015-1-17 20:55
fcode 发表于 2015-1-17 19:17
VS不允许同一共工程包含多种源代码。

你可以创建两个工程,一个 C 语言工程(只编译,不链接),得到 adSt ...

谢谢你的回复,按照你说的做了,但是好像还有问题

obj.JPG (123.12 KB, 下载次数: 548)

添加编译的obj

添加编译的obj

作者: fcode    时间: 2015-1-17 21:53
C 语言和 Fortran 混编不是那么简单的。

根据你的代码,我写了一个接口:

[Fortran] 纯文本查看 复制代码
Module Intf
        Implicit None
        Interface
          Subroutine PUSHCHARACTERARRAY( a , b )
          !DEC$ ATTRIBUTES DEFAULT, C , ALIAS:'_pushcharacterarray_' :: pushcharacterarray
            Integer :: a , b
          End Subroutine
        End Interface
      End Module Intf


把这个接口添加在 adBuffer.f 文件的开头。然后在 SUBROUTINE PUSHCHARACTER(x) 下方加上:Use Intf

这样就可以找到 PUSHCHARACTERARRAY 这个函数了。

其他函数请依样画葫芦。
作者: fcode    时间: 2015-1-17 21:58
另一个简单的方法是,修改 Fortran 工程的属性,使得其接口命名为 C 语言风格:

如下图:


同时,你需要在函数名后面加上下划线,即
CALL PUSHCHARACTERARRAY(ads1buf, 512)
改为
CALL PUSHCHARACTERARRAY_(ads1buf, 512)

其他函数类同。

这样做的结果就是,Fortran内部也用了 C 语言风格的约定。
作者: zhu_youren    时间: 2015-1-17 22:26
fcode 发表于 2015-1-17 21:58
另一个简单的方法是,修改 Fortran 工程的属性,使得其接口命名为 C 语言风格:

如下图:

非常感谢!你不知道就被这个卡住,多难受,多坑爹!路漫漫其修远兮,大恩不言谢!
作者: zhu_youren    时间: 2015-1-17 23:52
fcode 发表于 2015-1-17 21:53
C 语言和 Fortran 混编不是那么简单的。

根据你的代码,我写了一个接口:

我对C语言和Fortran混编几乎一点儿都不知道,但是又马上要用到,混编方面能否推荐些书籍或材料,非常感谢!
作者: fcode    时间: 2015-1-18 08:28
好的,不客气,混编因为受编译器影响很大(不同编译器操作就不同),所以基本没有系统的教材。

但编译器通常都有帮助文件,里面会有 mix language 方面的章节可以查看。
作者: pasuka    时间: 2015-1-18 20:10
fcode 发表于 2015-1-18 08:28
好的,不客气,混编因为受编译器影响很大(不同编译器操作就不同),所以基本没有系统的教材。

但编译器通 ...

其实用GCC的话,C和Fortran混合编程还是挺容易的
作者: fcode    时间: 2015-1-18 20:57
pasuka 发表于 2015-1-18 20:10
其实用GCC的话,C和Fortran混合编程还是挺容易的

是。同一个公司或组织的编译器,那肯定会方便很多。

我倒不是说麻烦,而是差异大。所以较难有统一的教材。
作者: pasuka    时间: 2015-1-19 08:27
fcode 发表于 2015-1-18 20:57
是。同一个公司或组织的编译器,那肯定会方便很多。

我倒不是说麻烦,而是差异大。所以较难有统一的教材 ...

其实,用F03的ISO C BINDING倒是易学,就是各家F和C编译器支持力度不一,譬如VC就比较坑爹




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2