gpt4 book ai didi

c++ - 为什么将我的程序与 iso_c_binding 链接会导致对 __gfortran_ 的 undefined reference ?

转载 作者:行者123 更新时间:2023-11-30 16:36:54 24 4
gpt4 key购买 nike

我有一个旧的 Fortran 代码,我想将其与新的 C/C++ 程序混合。

Fortran 子例程动态分配一些我想传递给 C 程序的数组。我只会在运行 Fortran 代码后获得这些数组的大小。

在这个论坛中获得一些提示后,我得到了以下代码,我认为它最好编译、链接和运行。

实际上我可以分别编译我的 C 代码和 Fortran 代码,但它不会链接并给出以下错误:

undefined reference to _gfortran_runtime_error

undefined reference to _gfortran_os_error

我使用 g++ 和 GFortran 编译器版本 5.4.0,并将两个 .o 文件与 g++ 和选项 -lg fortran 链接。

Fortran 代码:

subroutine test_allocation(outp) bind(c)
use iso_c_binding
implicit none
type (c_ptr), value :: outp
integer, target ::b(2)
integer(c_int), pointer :: a(:)
b(1)=1
b(2)=2
allocate(a(2))
a=>b
call c_f_pointer(outp, a,[2])
end subroutine

c代码:

#include <iostream>
using namespace std;
extern "C" void test_allocation(int ** ptr);
int main ()
{
int* ptr;
test_allocation(&ptr);
}

编辑:

正如 Vladimir F 在评论中所说,我的编译器选项有一个错误。正确的是 -lgfortran。

现在正在链接,但结果不是我所期望的。我更改了一些代码来显示这一点:

Fortran 代码:

subroutine test_allocation(outp) bind(c)
use iso_c_binding
implicit none
type (c_ptr), value :: outp
integer, target ::b(2)
integer(c_int), pointer :: a(:)
b(1)=1
b(2)=2
allocate(a(2))
a=>b
print*, "a(1) in Fortran: ", a(1)
print*, "a(2) in Fortran: ", a(2)
call c_f_pointer(outp, a,[2])
print*, "outp after c_f_pointer: ", outp
end subroutine

C 代码:

#include <iostream>

using namespace std;

extern "C" void test_allocation(int** ptr);



int main ()
{
int* ptr;
test_allocation(&ptr);
cout<<"ptr[0] in C: "<< ptr[0]<<endl;
cout<<"ptr[1] in C: "<< ptr[1]<<endl;

}

输出为:

a(1) in fortran:            1
a(2) in fortran: 2
outp after c_f_pointer: 140726088663920
ptr[0] in C: 1447122753
ptr[1] in C: 1107265857

我也尝试将 extern 函数的声明更改为以下内容,但仍然不起作用:

extern "C" void test_allocation(int*& ptr);
...
test_allocation(ptr);

输出为:

a(1) in fortran:            1
a(2) in fortran: 2
outp after c_f_pointer: 140729541703872
ptr[0] in C: 1447122753
ptr[1] in C: 1107265857

最佳答案

现在可以了。我没有使用 C_F_POINTER,而是使用了函数 C_LOC

我还从 TYPE(C_PTR) 声明中删除了参数 VALUE

这是代码:

subroutine test_allocation(outp) bind(c)
use iso_c_binding
implicit none
type (c_ptr) :: outp
integer ::b(2)
integer,dimension(:), pointer :: a
b(1)=1
b(2)=2
allocate(a(2))
a=b
print*, "a(1) in fortran: ", a(1)
print*, "a(2) in fortran: ", a(2)
outp=c_loc(a)
print*, "outp after c_loc: ", outp
end subroutine

它的输出:

a(1) in fortran:            1
a(2) in fortran: 2
outp after c_loc: 36866928
ptr[0] in C: 1
ptr[1] in C: 2

尽管我没有使用英特尔编译器,但以下链接对我帮助很大:

https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/269660

关于c++ - 为什么将我的程序与 iso_c_binding 链接会导致对 __gfortran_ 的 undefined reference ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247404/

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