码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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 :

    1. subroutine Sub_Fortran(NumInt,NumFloat,NumDouble)
    2. // 求幂的函数
    3. implicit none
    4. integer :: NumInt
    5. real :: NumFloat
    6. real(8) :: NumDouble
    7. NumDouble=NumFloat**NumInt
    8. end subroutine
    9. real(8) function Function_Fortran(NumDouble)
    10. // 开方的函数
    11. implicit none
    12. real(8) :: NumDouble
    13. Function_Fortran=sqrt(NumDouble)
    14. end function

    main.c:

    1. #include
    2. void sub_fortran_(int * num_int,float * num_float,double * num_double);// 求幂函数
    3. double function_fortran_(double *);//开方
    4. //
    5. int main()
    6. {
    7. int num_int;
    8. float num_float;
    9. double num_double;
    10. double num;
    11. num_int=4;
    12. num_float=2.0;
    13. sub_fortran_(&num_int,&num_float,&num_double);
    14. num=function_fortran_(&num_double);
    15. // 输出开方后的数 应该是 4
    16. printf("num_int=%d \n num_float=%f \n num_double=%f \n num=%f \n",num_int,num_float,num_double,num+1 );
    17. return 0;
    18. }

    在当前目录下依次执行:

    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 -lxxx 的gcc选项链接生成的libxxx.so。
    4. 把libxxx.so放入链接库的标准路径,或指定 LD_LIBRARY_PATH,才能运行链接了libxxx.so的程序。

    查看动态库中的函数

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

    nm -D XXX.so

    readelf -s XXX.so 

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

  • 相关阅读:
    【探花交友】注册登录需求分析、短信验证码
    【机器学习】红酒数据集和加利福尼亚的房价数据的随机森林算法详解
    MATLAB | MATLAB配色不够用 全网最全的colormap补充包来啦
    Apache + svn 服务搭建
    spring之bean的生命周期
    【从小白到大白01】c++类和对象
    理解 Redis 新特性:Stream
    企业用户如何快速搭建自己官方网站或者是电商网站?
    【乳腺癌诊断】基于聚类和遗传模糊算法乳腺癌(诊断)分析(Matlab代码实现)
    Navicat 携手华为云 GaussDB,联合打造便捷高效的数据库开发和建模工具方案
  • 原文地址:https://blog.csdn.net/weixin_40757930/article/details/123567767
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号