gpt4 book ai didi

在 Fortran 代码中调用 C 函数/子例程

转载 作者:太空狗 更新时间:2023-10-29 17:06:55 25 4
gpt4 key购买 nike

我正在尝试编译和链接调用 c 子例程的 Fortran 代码:

Fortran 代码:

program adder
integer a,b
a=1
b=2
call addnums(a,b)
stop
end program

C 代码:

void addnums( int* a, int* b ) 
{
int c = (*a) + (*b); /* convert pointers to values, then add them */
printf("sum of %i and %i is %i\n", (*a), (*b), c );
}

我在windows环境下使用如下命令编译链接

ifort -c adder.f
cl -c addnums.c
ifort -o add adder.obj addnums.obj

我收到以下错误:

Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
-out:add.exe
-subsystem:console
adder.obj
addnums.obj
adder.obj : error LNK2019: unresolved external symbol ADDNUMS referenced in function MAIN__
add.exe : fatal error LNK1120: 1 unresolved externals

请帮我解决这个问题?谢谢。

最佳答案

您需要在 Fortran 主程序的规范部分为 C 函数提供一个接口(interface)体,告诉 Fortran 编译器名称 addnums 是一个 C 函数。像这样的东西:

INTERFACE
SUBROUTINE addnums(a, b) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
IMPLICIT NONE
INTEGER(C_INT) :: a, b
END SUBROUTINE addnums
END INTERFACE

(对于那些在该平台上没有特殊选项的编译器,默认类型的整数与 C_INT 相同 - 但明确整数 KIND 有助于在编译器/平台或编译选项更改时保护您。)

关于在 Fortran 代码中调用 C 函数/子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com