Fortran Coder

查看: 7266|回复: 6
打印 上一主题 下一主题

[混编] C Fortran 混合编程

[复制链接]

10

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
29 点
跳转到指定楼层
楼主
发表于 2015-11-30 15:44:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用C,Fortran混合编程时遇到如下问题:fmain.obj : error LNK2019: unresolved external symbol _addnumber referenced in function _MAIN__,各位大侠知道该怎么解决吗?
我的Fortran代码为:
[Fortran] 纯文本查看 复制代码
    program fmain
    use,intrinsic:: iso_c_binding
    implicit none
    interface
        subroutine AddNumber(res,num) bind(C)
        use,intrinsic:: iso_c_binding,only: C_INT, C_DOUBLE
        implicit none
        real(kind=C_DOUBLE):: res
        integer(kind=C_INT):: num
        end subroutine AddNumber
    end interface
    integer(kind=4):: num
    real(kind=8):: res
    res=0d0
    do while(.true.)
        write(*,*) 'please input a integral number:'
        read(*,*) num
        call AddNumber(res,num)
        write(*,'(A,3X,F10.3)') 'The result is:',res
    enddo
    end program fmain
C代码为:
[C] 纯文本查看 复制代码
#include <stdio.h>
extern "C" void AddNumber(double res, int num)
{
        res=res+num;
}

操作系统是64位windows 7, 编译器是vs2010+intel visual fortran XE 2013


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

沙发
发表于 2015-11-30 18:08:58 | 只看该作者
解决方案管理器,截图。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

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

板凳
发表于 2015-11-30 18:19:28 | 只看该作者
修改了一下,gcc编译无问题,至于为啥这么改,ivf的帮助文档有详细的混合编程说明
首先得明白,传址传值
Fortran代码
[Fortran] 纯文本查看 复制代码
program fmain
use, intrinsic:: iso_c_binding
implicit none
interface
	subroutine addnum(a, b) bind(c, name="AddNumber")
	import
	implicit none
	type(c_ptr),value::a
	integer(c_int),value, intent(in)::b
	end subroutine
end interface
integer(c_int):: num
real(c_double),target:: res
num = 2
res = 1.0D0
call addnum(c_loc(res), num)
write(*, *)"Result:",res
end program 

C代码
[C] 纯文本查看 复制代码
#include <stdio.h>

void AddNumber(double *res, int num)
{
	printf("C\tInput:%f\n", *res);
	*res += (double)num;
	printf("C\tAdded:%f\n", *res);
}

评分

参与人数 1贡献 +8 收起 理由
fcode + 8

查看全部评分

10

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
29 点
地板
 楼主| 发表于 2015-11-30 18:36:22 | 只看该作者
pasuka 发表于 2015-11-30 18:19
修改了一下,gcc编译无问题,至于为啥这么改,ivf的帮助文档有详细的混合编程说明
首先得明白,传址、传值
...

谢谢你的解答,找了一晚上,终于找到了解决方法。
https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/326037

10

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
29 点
5#
 楼主| 发表于 2015-11-30 19:13:03 | 只看该作者
pasuka 发表于 2015-11-30 18:19
修改了一下,gcc编译无问题,至于为啥这么改,ivf的帮助文档有详细的混合编程说明
首先得明白,传址、传值
...

还想问你一个问题,就是bind(C,Name='')中Name表示的名字必须与C文件里的函数名一致是吗?与Fortran的函数名也必须一致还是可以不同呢?

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

6#
发表于 2015-11-30 19:26:36 | 只看该作者
与C的一致就行。不必与Fortran的函数名一致。(否则的话就没意思了,重复的名字连着写两次)

10

帖子

2

主题

0

精华

入门

F 币
52 元
贡献
29 点
7#
 楼主| 发表于 2015-12-1 06:53:54 | 只看该作者
fcode 发表于 2015-11-30 19:26
与C的一致就行。不必与Fortran的函数名一致。(否则的话就没意思了,重复的名字连着写两次) ...

知道啦,谢谢~
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-28 14:03

Powered by Tencent X3.4

© 2013-2024 Tencent

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