首页 > 系统相关 >[Linux]动静态库

[Linux]动静态库

时间:2024-11-30 12:10:47浏览次数:8  
标签:文件 gcc 头文件 静态 Linux 动态 链接

动静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库,但是,多个程序使用相同的静态库时,每个程序都会包含一份库的代码,可能会导致可执行文件体积较大。

动态库(.so):是在程序运行时被加载的库。当一个程序链接了动态库,在程序启动时,操作系统的动态链接器会加载所需的动态库到内存中。多个程序可以共享同一个动态库的代码段,这有助于减少内存的占用。

库的本质就是.o文件的集合。我们有如下的两个源文件,如果我们不想给对方我们的源代码,那么就可以给对方提供.o文件(可重定位二进制目标文件),和头文件。对方就可以用它的代码来链接我们的.o文件,使用我们提供的方法。(.o文件提供方法,.h文件说明都有什么方法)

将多个文.o件打包形成一个文件,这其实就是库。根据打包方式的不同,就可以分为静态库和动态库。

静态库

通过ar [选项] [静态库文件名] [目标文件列表]命令创建或更新静态库。

  • -r:将目标文件插入到静态库中。如果静态库中已经存在同名的目标文件,则替换它。
  • -c:创建静态库文件时,不显示创建过程的详细信息。如果静态库不存在,则创建它;如果已经存在,则更新它 。

如上就通过ar命令形成了一个静态库文件。但是这个文件并不能直接链接形成可执行文件,因为这个文件并没有包含头文件。我们之所以能够在系统上运行我们的程序,是因为C语言已经给我们提供了对应的头文件和库文件。

如上,我们已经将头文件和.a文件打包,此时只需要将这个包发给别人就可以了。

使用静态库

  1. 第一种方法

    此时打包好的库文件和源文件在同一个目录下,当我们使用gcc进行编译的时候,它仍然报错,提示头文件找不到。但是我们不是已经有头文件了吗?那是因为在搜索头文件的时候,编译器会在当前路径下搜索或在系统默认指定路径下搜索。当前路径是指和源代码处在同一级的路径,而这里.h文件的路径太深了。

    想要成功的编译链接形成一个可执行文件。我们还需要三个选项,分别是-I-L-l

    • -I:指明头文件的位置。
    • -L:指明库文件的位置。
    • -l:指明库名称。(库名称是指去掉前缀和后缀所剩下的部分,如libmymath.a去掉前后缀后只剩下mamath

    此时就成功形成了可执行文件。我们在来看一下下面这张图:

    这里不对啊!我明明是静态库,但是为什么显示的是动态链接呢?这是由于gcc默认是动态链接的,当你编译链接形成可执行文件时,你不仅仅使用了你自己的静态库,你还用了C语言提供的动态库,只要使用了动态库,那么gcc就会选择默认的动态链接,尽管你提供的是静态库。

  2. 第二种方法

    第二种方法就是直接将头文件和库文件放到对应的系统指定的路径下。头文件放到/usr/include目录下,库文件放到/usr/lib64目录下。但是编译的时候仍然要加上-l选项,也就是指定库的名称。(这种方法并不推荐)

动态库

创建动态库

使用 gcc 编译器并带上 -fPIC(Position-Independent Code,位置无关代码)选项将源文件编译成目标文件(.o 文件)。

gcc -fPIC -c my_sub.c
gcc -fPIC -c my_add.c

接着,使用 gcc 编译器的 -shared 选项,基于之前生成的目标文件来创建动态库。

gcc -shared -o libmymath.so my_add.o my_sub.o

如此,就创建了一个动态库。

使用动态库

与静态库一样,要使用这个动态库,就要将头文件和这个库同时给其他人。将动态库与自己的程序编译链接形成可执行文件的方法与静态库一样。

gcc -o my_math main.c -I mylib/include/ -L mylib/lib/ -l mymath

但是当你运行形成的可执行文件的时候,会发现他报错了,显示这个库找不到。我们不是已经将头文件和库文件的位置都告诉它了吗,为什么还是找不到呢?

这是因为你只将库的路径告诉了gcc,所以gcc编译链接的时候没问题。但是我们现在是在执行程序,执行的时候已经和gcc没有关系了,之和操作系统有关。而对于操作系统你并没有指明库的路径。

指明路径

给操作系统指明库的路径有以下几种方法。

  1. 将路径添加到LD_LIBRARY_PATH环境变量中。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wzh/studyCode/my_lib/test/mylib
    

    此时再运行程序就可以正常执行了。但是这个方法只是临时的,一旦退出,下次想要正常运行就要重复这个操作。

  2. 将库添加到usr/lib64目录下。

    这个方法是永久有效的,但是不推荐。

  3. 更改/etc/ld.so.conf.d/下的配置文件。

    首先在/etc/ld.so.conf.d/下创建一个文件,然后再将库所在的路径写入到该文件中(当然不创建也可以,随便将库路径写入到该目录下的任意文件中)。最后还要执行sudo ldconfig这条命令,配置文件才能生效。

    如此,这个路径就永久有效了。

  4. 建立软链接

    在和执行文件同级的目录下建立一个库文件的软链接(也可以将这个链接直接建立在/usr/lib64目录下)。如下

    ln -s  /home/wzh/studyCode/my_lib/test/mylib/lib/libmymath.so libmymath.so
    

    像这样,程序同样可以正常运行。

标签:文件,gcc,头文件,静态,Linux,动态,链接
From: https://www.cnblogs.com/wzhiheng/p/18578260

相关文章

  • 《码农增刊Linus与Linux》读后感
     林纳斯的解释是,有三件事具有生命的意义。它们是你生活当中所有事情的动机。第一是生存,第二是社会秩序,第三是娱乐。生活中所有的事情都是按这个顺序发展的,娱乐之后便一无所有。其实每个人都有自己的理论,一件事做或者不做,都是自己说服自己,每一次进步,要么是推翻自己的理论,要么是......
  • Linux -初识 与基础指令1
    博客主页:【夜泉_ly】本文专栏:【Linux】欢迎点赞......
  • OpenVZ 9.0 - 基于容器的 Linux 开源虚拟化解决方案
    OpenVZ9.0-基于容器的Linux开源虚拟化解决方案Opensourcecontainer-basedvirtualizationforLinux请访问原文链接:https://sysin.org/blog/openvz-9/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgPoweredbyVirtuozzoOpenVZ允许多个安全、隔离的Linu......
  • Linux之内存优化
    虚拟内存与物理内存计算机系统把内存组织成固定大小的页(page),页的大小是基于处理器架构的,例如在x86_64上标准的页为4K。物理内存被划分为页帧(frames),一个页帧包含一页数据。进程不会直接寻址物理内存,每个进程都有一个虚拟地址空间,当进程请求内存时,内核通过查找页表将页帧......
  • Linux之性能调优
    什么是性能调优?性能调优是调整系统设置以提高计算资源利用率,数据吞吐量和用户体验的过程。它需要非常了解系统的硬件和软件组件,以及系统之间的许多交互。性能调优有时也被称为“黑色艺术”。性能调优经常与故障排查相混淆。但两者有很多区别。在做故障诊断时,主要目标是发现并解......
  • Linux的介绍及虚拟机centOS系统的下载与应用
    1、什么是LinuxLinux是一种类Unix操作系统,它的内核(Kernel)由LinusTorvalds于1991年首次发布。作为一个开源、免费的操作系统,Linux被广泛用于服务器、桌面计算机、嵌入式设备、移动设备等各种场景。1、操作系统操作系统是一组主管并控制计算机软硬件、资源以及服......
  • Linux文件系统详解(四)
    ......
  • Linux文件系统详解(三)
    ......
  • Linux系统上使用nvm管理nodejs和npm版本操作
    安装nvm由于Github的访问性问题,所以我们不使用Github安装,而是使用Gitee安装,使用的Gitee仓库为:https://gitee.com/RubyMetric/nvm-cn安装命令为:bash-c"$(curl-fsSLhttps://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"安装后验证:重启shell或者执行source~/.nvm/n......
  • 【Linux探索学习】第十七弹——进程终止:深入解析操作系统中的进程终止机制
    Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482前言:在操作系统中,进程终止是一个至关重要的阶段,它标志着进程的生命周期结束。进程终止可能是因为任务完成,也可能是因为异常或外部干预。本文将详细讲解操作系统中的进程......