Fortran Coder

查看: 18696|回复: 10

[混编] Fortran程序中调用C语言程序文件

[复制链接]

9

帖子

2

主题

0

精华

入门

F 币
84 元
贡献
37 点

规矩勋章

发表于 2015-1-17 17:44:06 | 显示全部楼层 |阅读模式
本帖最后由 zhu_youren 于 2015-1-17 17:49 编辑

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

Fortran程序中调用C程序文件

Fortran程序中调用C程序文件

选择的是控制台应用程序

选择的是控制台应用程序

src.rar

34.2 KB, 下载次数: 11

程序源码

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-1-17 19:17:45 | 显示全部楼层
VS不允许同一共工程包含多种源代码。

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

9

帖子

2

主题

0

精华

入门

F 币
84 元
贡献
37 点

规矩勋章

 楼主| 发表于 2015-1-17 20:55:33 | 显示全部楼层
fcode 发表于 2015-1-17 19:17
VS不允许同一共工程包含多种源代码。

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

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

添加编译的obj

添加编译的obj

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-1-17 21:53:57 | 显示全部楼层
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 这个函数了。

其他函数请依样画葫芦。

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

如下图:
QQ截图20150117215642.png

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

其他函数类同。

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

9

帖子

2

主题

0

精华

入门

F 币
84 元
贡献
37 点

规矩勋章

 楼主| 发表于 2015-1-17 22:26:20 | 显示全部楼层
fcode 发表于 2015-1-17 21:58
另一个简单的方法是,修改 Fortran 工程的属性,使得其接口命名为 C 语言风格:

如下图:

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

9

帖子

2

主题

0

精华

入门

F 币
84 元
贡献
37 点

规矩勋章

 楼主| 发表于 2015-1-17 23:52:50 | 显示全部楼层
fcode 发表于 2015-1-17 21:53
C 语言和 Fortran 混编不是那么简单的。

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

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

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

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

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

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

但编译器通 ...

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

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-1-18 20:57:03 | 显示全部楼层
pasuka 发表于 2015-1-18 20:10
其实用GCC的话,C和Fortran混合编程还是挺容易的

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

我倒不是说麻烦,而是差异大。所以较难有统一的教材。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-19 02:45

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表