在Ubuntu上,Fortran和C語言可以通過幾種不同的方法進行交互。以下是一些常見的方法:
使用ISO C Binding:
Fortran 90及以后的版本支持ISO C Binding,這是一種標準的方法,允許Fortran代碼調用C函數,反之亦然。為了使用ISO C Binding,你需要在Fortran代碼中使用bind(C)
屬性,并確保遵循C的命名和調用約定。
Fortran示例(假設文件名為example.f90
):
subroutine add(a, b, c) bind(C, name="add")
use, intrinsic :: iso_c_binding
real(c_double), intent(in) :: a, b
real(c_double), intent(out) :: c
c = a + b
end subroutine add
C示例(假設文件名為example.c
):
#include <stdio.h>
// 聲明Fortran子程序,確保名稱匹配
double add_(double *a, double *b, double *c);
int main() {
double x = 1.0, y = 2.0, z;
z = add_(&x, &y, &z);
printf("The sum is %f\n", z);
return 0;
}
注意Fortran編譯器會將函數名修飾為add_
,因此在C中調用時需要加上下劃線。
使用extern “C”:
在C++中,你可以使用extern "C"
來聲明Fortran函數,以避免名稱修飾。但是,這種方法不適用于純C環境。
使用C接口文件:
你可以創建一個C接口文件(通常是.h
文件),其中包含Fortran子程序的C風格的聲明。然后,在C代碼中包含這個頭文件,并鏈接到Fortran編譯器生成的庫。
使用CMake或Makefile: 為了簡化構建過程,你可以使用CMake或Makefile來管理編譯和鏈接步驟。這些工具可以幫助你自動處理編譯器標志和依賴關系。
使用共享庫:
你可以將Fortran代碼編譯成共享庫(.so
文件),然后在C程序中使用dlopen
和dlsym
函數動態加載和調用Fortran函數。這種方法比較高級,通常用于需要在運行時動態加載函數的場景。
下面是一個簡單的CMakeLists.txt文件示例,用于構建上述Fortran和C代碼:
cmake_minimum_required(VERSION 3.10)
project(FortranCInteraction)
# 設置Fortran編譯器
set(CMAKE_Fortran_COMPILER gfortran)
# 添加Fortran源文件
add_library(fortran_lib SHARED example.f90)
# 添加C源文件
add_executable(c_app example.c)
# 鏈接Fortran庫到C程序
target_link_libraries(c_app fortran_lib)
使用CMake構建項目時,只需在項目目錄中運行以下命令:
mkdir build
cd build
cmake ..
make
這將編譯Fortran代碼為共享庫,并將其鏈接到C程序中。然后你可以運行生成的可執行文件c_app
來測試交互。