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

这篇具有很好参考价值的文章主要介绍了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博客_动态库
 

格式

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

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

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 下编译实现C/Fortran调用动态库

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 

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

中间一栏是T的代表导出的函数名文章来源地址https://www.toymoban.com/news/detail-443935.html

到了这里,关于Linux 下编译实现C/Fortran调用动态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 运用(codeDom和反射技术)动态编译dll ,动态调用

          在软件运用工程中,往往会根据各种各样,花样百出的需求来设计软件,在最近的项目中无意中,我就遇到了一个需求,据说是,客户要动态编译dll ,我“滴个乖乖”,这是要逆天啊! 话不多说,直接来点干货。 简单分享一下个小demo: 1.运用codeDom技术实现动态程序集

    2024年02月13日
    浏览(26)
  • C++调用matlab编译动态库方法及相关问题解决

    matlab与C/C++混合编程——在Windows/Linux上调用Matlab编译的动态库文件 1.1.1、功能 把matlab代码编译成动态库,C++调用matlab生成的动态库 1.1.2、参考链接 C++ Dll导出及python调用C++ DLL 1.1.3、matlab编译动态库方法 1、切换到“App”菜单; 2、选择下拉框,在下拉框中输入lib进行筛选;

    2024年02月01日
    浏览(31)
  • 编写c语言程序调用openssl编译出的动态链接库

    下载安装openssl并编译生成链接库的过程在我的另一篇文章中已经详细说明了:Ubuntu中安装OpenSSL 此外,我们还需要提前了解一些关于动态链接库的知识,具体内容可以在我的这篇文章中查看:一个简单的动态链接库示例 要调用OpenSSL库中的函数,需要在对应的C源文件中包含相

    2024年02月11日
    浏览(46)
  • windows下使用microsoft、intel、gnu不同编译器利用cmake和vscode对c++和fortran程序进行编译和调试

    由于编译器支持特性、编译后程序运行速度、安装使用便捷程度等的不同,我们往往会安装多种不同的编译器。对于c++语言主要的编译器有:microsoft、intel、gnu等,对于fortran语言则更多,包括gnu、intel、pgi等等。不同的编译器在一个系统下,往往需要利用一些手段进行区分,

    2024年02月05日
    浏览(46)
  • linux系统根目录动态扩容

    前提:虚拟机系统根目录占用40GB,创建vm时磁盘大小给120GB 1. 将剩余空间分区 2. 创建pv 3.vg(centos)扩容

    2024年02月07日
    浏览(52)
  • windows11下编译openpose并通过pyCharm调用

    做毕设的时候要用到Openpose提取人体骨骼关键点,且需要在python中调用编程。过程花了几天,踩了不少坑,做个详细的笔记在这里。 windows 11 64bit; CUDA v11.6 cuDNN 8.3.2.44 Visual Studio 2022 Community PyCharm 2021.3 Community 安装CUDA和cuDNN(网上教程很多) 下载Openpose(目前最新的是1.7.0,链

    2024年02月04日
    浏览(34)
  • Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等

    1.查看被占用的端口的进程, netstat/ss -antulp | grep :端口号 2.通过上面的命令就可以列出,这个端口被哪些应用程序所占用,然后找到对应的进程PID 3.根据PID查询进程。如果想详细查看这个进程,PID具体是哪一个进程,可以通过命令的方式进行查看进程的详细信息, ps -ef | gr

    2024年02月16日
    浏览(33)
  • linux下使用gcc编译工具出现“命令未找到”或“没有那个文件或目录”等提示

    在linux系统中使用gcc编译工具对C程序进行编译时,报错显示“gcc命令未找到”或“没有那个文件或目录”,而此时你确定已经安装了gcc编译工具,这大概率是因为系统未能找到gcc命令的安装位置所导致的,需要将gcc的安装路径添加到PATH环境变量中,解决方法如下:        

    2024年02月08日
    浏览(39)
  • netcore工程在linux下调用linux动态库

    文章的内容可能看着枯燥,排版也存在一些问题,但是如果你遇到相关问题,真的无法解决的时候,不妨沉下心来好好阅读一下这篇文章,你会有所收获,也可以先跳到文章最后,看看是不是对你的问题有价值。。 使用P/invoke方式 如果出现调用失败的情况,可能是so文件缺少

    2023年04月26日
    浏览(29)
  • Linux下动态库和静态库编译实践

    之前写过JNI的文章,在JNI实践过程中,也涉及到对动态库/静态库的一些编译实践,这里统一记录一下。 注意 :-fPIC编译选项可使GCC生成位置无关代码,简单来说生成的代码中的函数与全局变量均为相对地址,通过GOT (Global offset table)来确定其位置,这种方式引入了一层额外的

    2024年01月17日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包