Linux 下编译实现C/Fortran调用动态库

目录

Fortran语言

格式

Windows Linux下动态库介绍

windows下obj, lib, dll, exe的关系

linux .o, .a, .so

生成动态库Demo

查看动态库中的函数


Fortran语言

FORTRAN语言是Formula Translation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。

FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,直到2022年已有六十六年的历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。

Fortran 语言学习(菜鸟都可以看得懂的入门级教程)(持续更新中ing...)_caorui_blog的博客-CSDN博客_fortran

什么是动态库?什么又是静态库?(如何生成/如何使用 ! ! !)_小羊教你来编程的博客-CSDN博客_动态库
 

格式

a6ea38b4358132c07bf0e8bdb2a4f3d3.png

Windows Linux下动态库介绍

linux中.o时什么文件,Linux的.a、.so和.o文件_GUlijiwa古力的博客-CSDN博客

windows下obj, lib, dll, exe的关系

lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。
所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。
所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。
lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。这样编译器编译好一个cpp以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统一link成所需要的exe,应该说缺少任意一个obj都会导致exe的链接失败。

linux .o, .a, .so

对比Windows下的文件:.o,是目标文件,相当于windows中的.obj文件
.so 为共享库,是shared object,用于动态连接的,相当于windows下的dll
.a 为静态库,是好多个.o合在一起,用于静态连接
 

生成动态库Demo

前提是当前Linux操作系统需要有gfortran gcc g++等编译器。

sub.f90 :

subroutine Sub_Fortran(NumInt,NumFloat,NumDouble)
// 求幂的函数
      implicit none
      integer :: NumInt
      real :: NumFloat
      real(8) :: NumDouble
      NumDouble=NumFloat**NumInt
end subroutine

real(8) function Function_Fortran(NumDouble)
// 开方的函数
      implicit none
      real(8) :: NumDouble
      Function_Fortran=sqrt(NumDouble)
end function

main.c:

#include <stdio.h>

void sub_fortran_(int * num_int,float * num_float,double * num_double);// 求幂函数
double function_fortran_(double *);//开方
// 
int main()
{
      int num_int;
      float num_float;
      double num_double;
      double num;
      num_int=4;
      num_float=2.0;
      sub_fortran_(&num_int,&num_float,&num_double);
      num=function_fortran_(&num_double);
	  // 输出开方后的数 应该是  4
      printf("num_int=%d \n num_float=%f \n num_double=%f \n num=%f \n",num_int,num_float,num_double,num+1 );
      return 0;
}

在当前目录下依次执行:

gfortran -c -fpic sub.f90          把sub.f90       生成sub.o 目标文件
gfortran -shared -o sub.so sub.o       将sub.o链接生成动态库  
// gfortran main.f90 sub.so -o main       如果主函数是用fortran写的可以这样执行
gcc main.c sub.so -o main         生成可执行文件
LD_LIBRARY_PATH=. ./main               

显示:

Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。

在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。

程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。

Linux下生成和使用动态库的步骤如下:

  1. 编写源文件。
  2. 将一个或几个源文件编译链接,生成共享库。
  3. 通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so。
  4. 把libxxx.so放入链接库的标准路径,或指定 LD_LIBRARY_PATH,才能运行链接了libxxx.so的程序。

查看动态库中的函数

通过下列指令查看fortran文件中导出的函数

nm -D XXX.so

readelf -s XXX.so 

中间一栏是T的代表导出的函数名

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值