温馨提示×

centos Fortran和C如何混合编程

小樊
54
2026-09-27 11:13:12
栏目: 智能运维

在 CentOS 上实现 Fortran 与 C 的混合编程,核心思路是:
利用两种语言对底层函数调用和符号命名的约定,通过编译器生成目标文件后链接在一起。

下面从 原理 → 编译方法 → 示例 → 常见坑 四部分说明。


一、基本原理

1. 函数名修饰(Name Mangling)

  • C:函数名基本不变

    void foo(int a);
    

    符号:foo

  • Fortran(gfortran):默认会 变成小写并加下划线

    subroutine foo(a)
    

    符号:foo_ 或 foo(取决于编译选项)

2. 调用约定

  • Fortran 默认 按引用传参(pass by reference)
  • C 默认 按值传参
  • 在 C 中要用指针来匹配 Fortran

二、CentOS 环境准备

sudo yum install gcc gcc-gfortran

检查版本:

gcc --version
gfortran --version

三、示例 1:C 调用 Fortran

Fortran 代码(foo.f90)

subroutine foo(a, b, c)
    integer, intent(in) :: a, b
    integer, intent(out) :: c
    c = a + b
end subroutine foo

C 代码(main.c)

#include <stdio.h>

extern void foo_(int *a, int *b, int *c);

int main() {
    int a = 3, b = 4, c;
    foo_(&a, &b, &c);
    printf("c = %d\n", c);
    return 0;
}

编译

gfortran -c foo.f90
gcc main.c foo.o -lgfortran -o test
./test

四、示例 2:Fortran 调用 C

C 代码(bar.c)

#include <stdio.h>

void bar(int *n) {
    printf("n = %d\n", *n);
}

Fortran 代码(main.f90)

program main
    integer :: n
    n = 10
    call bar(n)
end program main

编译

gcc -c bar.c
gfortran main.f90 bar.o -o test
./test

五、使用 ISO_C_BINDING(推荐方式 ✅)

这是 现代 Fortran 标准做法,不受编译器符号规则影响。

Fortran 调用 C

program main
    use iso_c_binding
    interface
        subroutine bar(n) bind(c)
            use iso_c_binding
            integer(c_int), value :: n
        end subroutine bar
    end interface

    call bar(10)
end program main

C 代码

#include <stdio.h>

void bar(int n) {
    printf("n = %d\n", n);
}

六、常见坑(CentOS 特别注意事项)

1. 忘记链接 -lgfortran

gcc main.c foo.o   # ❌
gcc main.c foo.o -lgfortran  # ✅

2. Fortran 数组是列优先

C 是行优先,矩阵运算要小心。

3. 字符串传递复杂

Fortran 字符串会附带长度参数,建议用 iso_c_binding + c_char。


七、总结

方式 推荐度 说明
手动加下划线 ❌ 不跨平台
iso_c_binding ✅✅✅ 标准、稳定
直接链接 ✅ 适合老代码

如果你有 具体场景(数值计算 / MPI / BLAS / LAPACK / 老代码迁移),我可以给你更针对性的示例。

0 踩