热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux下库文件的创建和使用及其他

文章标题:linux下库文件的创建和使用及其他。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

首先说明一下头文件、库文件、库函数这三个概念的区别。头文件:即后缀为.h的文件,在其中对变量和函数原型进行了声明。库文件:提供有库函数的文件。一种是静态连接的后缀为.a的文件,在程序编译时连接;一种是共享库,文件后缀为.so,在程序运行的时候才进行连接。库函数:在库文件里提供的函数。
    下面,我们用一个实例介绍一下怎么样创建库文件以及怎么样应用库文件。
    文件1: mymath.h
     #ifndef MYMATH_H
     #define MYMATH_H
     int xiangjia(int a,int b);
     int xiangjia(int a,int b);
     #endif
    文件2:xiangjia.c
    int xiangjia(int a,int b)
    {
      return a+b;
    }
    文件3:xiangjian.c
    int xiangjian(int a,int b)
    {
      return a-b;
    }
    文件4:main.c
     #include "mymath.h"
     #include “stdio.h”
      int main()
     {
       printf(“%d”,xiangjia(65,45));
       printf(“%d”,xiangjian(65,45));
       return 0;
     }
    无论动态库还是静态库都需要用到.o文件来生成,先编译生成.o文件。
    # gcc -c xiangjia.c xiangjia.c main.c
   

一、创建静态库
    静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为math56,则静态库文件名就是libmath56.a。
    # ar cr libmath56.a xiangjia.o xiangjian.o
    链接静态库,生成可执行文件:
    #gcc ?o math main.o libmath56.a
    或者 # gcc ?o math main.c ?L. ?lmath56
    执行:
    # ./math
    110
    20
  

  二、利用.o文件创建动态库
    动态库文件扩展名为.so,使用下面的命令可以生成l ibmath56.so文件。
    # gcc -shared -fPCI -o libmath56.so xiangjia.o xiangjia.o
    生成可执行文件math2
    # gcc ?o math2 main.c -L. ?lmath56
    执行:
    # ./math
    ./math: error while loading shared libraries: libmath56.so: cannot open shared object file: No such file or directory
    呕哦,出错了!快看看错误提示,原来是找不到共享库文件libmath56.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
    如何找到生成的动态库有3种方式:
    1)把库拷贝到/usr/lib和/lib目录下。
    (2)在LD_LIBRARY_PATH环境变量中加上库所在路径。
    例如动态库libhello.so在/home/example/lib目录下:
    $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib
    (3) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。
    当静态库和动态库同名时, gcc命令将优先使用动态库。
   

    三、几个参数的理解
    读者可能忘记了以上所用到的gcc编译参数的意义,这里作简单介绍:
    -fPIC  生成与位置无关的代码,这样库就可以在任何位置被链接和装载。
    -shared 指定生成共享链接库
    -static 指定生成静态链接库
    -l     指定链接的库文件
    -L    指定库文件所在的位置
    虽然linux下大多数函数都默认将头文件放到/usr/include目录下,而库文件放到/usr/lib下,但并不是所有的情况都是这样。在Linux下使用C语言开发应用程序时,完全不使用第三方函数库的情况是比较少的,通常来将都需要借助一个或多个函数库的支持才能够完成相应的功能。正因为如此,gcc在编译的时候必须让编译器知道如何来查找所需要的头文件和库文件。Gcc采用搜索目录的方法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径中添加新的目录。例如在/home/david/include目录下有编译的时候所需要的头文件,为了能够让gcc顺利的找到他们,就可以使用-I选项:
    # gcc david.c ?I /home/david/include ?o david
    同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向gcc的库文件搜索路径中添加新的路径,例如在/home/david/lib目录下有编译的时候所需要的库文件,为了能够让gcc顺利的找到他们,就可以使用-L选项:
    # gcc david.c ?L /home/david/lib ?ldavid ?o david
    这里解释一下-l选项,它指示gcc去连接库文件libdavid.so,linux下的库文件在命名的时候有个约定,那就是以lib开头,所有的库文件都遵循了这个规范,因此用-l选项指定连接的库文件时就可以省略lib三个字符了。


推荐阅读
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 字符常量与变量的定义及使用方法
    本文介绍了字符常量与变量的定义及使用方法,包括字符常量的定义、值和转义字符的表示方法;字符串常量的定义和结束标志;字符型数据与整型数据的区别;字符型变量的定义和内存占用;字符串变量的运算方法。同时提醒注意字符串常量不可赋值给字符型变量,需使用数组或指针进行存取。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
author-avatar
YooHoo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有