zhu_youren 发表于 2015-1-17 17:44:06

Fortran程序中调用C语言程序文件

本帖最后由 zhu_youren 于 2015-1-17 17:49 编辑

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

fcode 发表于 2015-1-17 19:17:45

VS不允许同一共工程包含多种源代码。

你可以创建两个工程,一个 C 语言工程(只编译,不链接),得到 adStack.obj 文件
一个 Fortran 工程,包含所有 f 文件和 adStack.obj 文件。

zhu_youren 发表于 2015-1-17 20:55:33

fcode 发表于 2015-1-17 19:17
VS不允许同一共工程包含多种源代码。

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

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

fcode 发表于 2015-1-17 21:53:57

C 语言和 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:22

另一个简单的方法是,修改 Fortran 工程的属性,使得其接口命名为 C 语言风格:

如下图:


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

其他函数类同。

这样做的结果就是,Fortran内部也用了 C 语言风格的约定。

zhu_youren 发表于 2015-1-17 22:26:20

fcode 发表于 2015-1-17 21:58
另一个简单的方法是,修改 Fortran 工程的属性,使得其接口命名为 C 语言风格:

如下图:


非常感谢!你不知道就被这个卡住,多难受,多坑爹!路漫漫其修远兮,大恩不言谢!

zhu_youren 发表于 2015-1-17 23:52:50

fcode 发表于 2015-1-17 21:53
C 语言和 Fortran 混编不是那么简单的。

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


我对C语言和Fortran混编几乎一点儿都不知道,但是又马上要用到,混编方面能否推荐些书籍或材料,非常感谢!

fcode 发表于 2015-1-18 08:28:08

好的,不客气,混编因为受编译器影响很大(不同编译器操作就不同),所以基本没有系统的教材。

但编译器通常都有帮助文件,里面会有 mix language 方面的章节可以查看。

pasuka 发表于 2015-1-18 20:10:26

fcode 发表于 2015-1-18 08:28
好的,不客气,混编因为受编译器影响很大(不同编译器操作就不同),所以基本没有系统的教材。

但编译器通 ...

其实用GCC的话,C和Fortran混合编程还是挺容易的

fcode 发表于 2015-1-18 20:57:03

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

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

我倒不是说麻烦,而是差异大。所以较难有统一的教材。
页: [1] 2
查看完整版本: Fortran程序中调用C语言程序文件