首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux下动态库如何使用吗

在Linux操作系统下,动态库(Dynamic Libraries)是一种在程序运行时被加载的共享库,它允许程序在多个进程之间共享代码和数据,从而减少内存占用和提高执行效率。动态库的文件通常以.so(Shared Object)为扩展名。

基础概念

动态库:在程序运行时才加载到内存中的库,可以被多个程序共享。

静态库:在编译时就已经链接到程序中的库,每个使用它的程序都会有库的一个副本。

使用动态库的优势

  1. 节省内存:多个程序可以共享同一个动态库实例。
  2. 便于更新和维护:更新库文件后,所有依赖它的程序无需重新编译即可使用新版本。
  3. 灵活性:程序可以在运行时决定加载哪个库。

类型

  • 共享库(Shared Libraries):如.so文件。
  • 位置无关代码库(Position Independent Code Libraries):使用-fPIC编译选项生成。

应用场景

  • 大型软件系统:多个组件可能需要共享相同的代码。
  • 插件架构:允许第三方开发者编写扩展功能的插件。
  • 跨平台兼容性:编写一次代码,可以在不同平台上运行。

如何使用动态库

创建动态库

假设我们有一个简单的C语言函数,存放在mylib.c文件中:

代码语言:txt
复制
// mylib.c
int add(int a, int b) {
    return a + b;
}

首先,需要编译这个源文件生成位置无关的目标文件:

代码语言:txt
复制
gcc -c -fPIC mylib.c -o mylib.o

然后,将目标文件打包成动态库:

代码语言:txt
复制
gcc -shared mylib.o -o libmylib.so

使用动态库

创建一个使用这个动态库的应用程序main.c

代码语言:txt
复制
// main.c
#include <stdio.h>

extern int add(int a, int b);

int main() {
    int result = add(3, 4);
    printf("The result is %d\n", result);
    return 0;
}

编译应用程序时,需要指定链接动态库:

代码语言:txt
复制
gcc main.c -L. -lmylib -o myapp

这里-L.告诉编译器在当前目录下查找库文件,-lmylib指定链接的库名(去掉前缀lib和后缀.so)。

运行程序

运行程序时,操作系统需要知道在哪里找到动态库。可以通过以下几种方式之一来实现:

  1. 设置LD_LIBRARY_PATH环境变量
代码语言:txt
复制
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./myapp
  1. 更新/etc/ld.so.conf文件:添加动态库的路径,然后运行ldconfig命令。
  2. 在程序中使用dlopen等函数动态加载库

遇到的问题及解决方法

问题:运行程序时提示找不到动态库。

原因:操作系统无法在默认路径或指定的LD_LIBRARY_PATH中找到动态库。

解决方法

  • 确保动态库文件存在于指定的路径。
  • 使用ldd命令检查程序依赖的库是否都存在:
代码语言:txt
复制
ldd myapp
  • 如果库文件在其他非标准路径,可以通过修改LD_LIBRARY_PATH或在程序启动脚本中添加路径。

示例代码

以上面的mylib.cmain.c为例,完整的编译和运行步骤如下:

代码语言:txt
复制
# 编译动态库
gcc -c -fPIC mylib.c -o mylib.o
gcc -shared mylib.o -o libmylib.so

# 编译应用程序
gcc main.c -L. -lmylib -o myapp

# 运行程序(设置LD_LIBRARY_PATH)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./myapp

通过以上步骤,你可以在Linux系统下成功创建和使用动态库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux下的静态库与动态库

由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 2.库的种类 linux下的库有两种:静态库和共享库(动态库)。...4.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库...在linux下,库文件一般放在/usr/lib /lib下, 静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称 动态库的名字一般为libxxxx.so.major.minor,xxxx...库和ld-linux库 7.可执行程序在执行的时候如何定位共享库文件 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径 此时就需要系统动态载入器(dynamic linker...—/lib/,/usr/lib目录找到库文件后将其载入内存 8.在新安装一个库之后如何让系统能够找到他 如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

9610
  • Linux下动态库(.so)和静态库(.a) 的区别

    linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。...静态库和动态库的最大区别,静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。...总结: 编译静态库时先使用-c选项,再利用ar工具产生.编译动态库的方式依不同版本的UNXI而定。隐式调用动态库与静态库的用法相一致,而显示调用动态库则需要借助动态加载共享库函数族。...隐式调用动态库和静态库使用方法一致,使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?...通过测试可以发现,当静态库和动态库同名时, gcc命令将优先使用动态库.为了确保使用的是静态库, 编译时可以加上 -static  选项,因此多第三方程序为了确保在没有相应动态库时运行正常,喜欢在编译最后应用程序时加入

    17.3K21

    Linux环境下静态库和动态库的实现

    Linux 环境下静态库和动态库的实现 在软件开发中,库是非常重要的组成部分。它们包含了一组可复用的函数和代码片段,用于提高开发效率和代码质量。在Linux系统中,库分为静态库和动态库两种。...与静态库不同,动态库不被嵌入到可执行文件中,而是以共享方式供多个程序使用。 创建动态库 编写需要共享的函数代码。 使用 -fPIC 选项生成位置无关代码。 使用 gcc -shared 创建动态库。...将库文件组织到目录结构中: mv libmath.so mylib/lib/ 使用动态库 方法1:临时指定库路径 gcc main.c -I..../ 下添加配置文件 创建一个新的配置文件,例如 mylib.conf,内容为动态库的路径: echo "/path/to/mylib/lib" | sudo tee /etc/ld.so.conf.d/...因此,动态库使得磁盘空间的使用更加高效,尤其是在多个应用程序依赖同一个库时。 动态库可以在不重新编译应用程序的情况下进行更新。只需替换系统中的动态库文件,所有依赖该库的程序都能自动使用新版本的库。

    8510

    Linux下静态库、动态库的创建与调用

    一、前言 在项目开发时,经常会用到第三方库,也会自己创建动态库给别人或者给自己其他的工程项目使用。 库的类型分为动态库、静态库。 在Linux下动态库的后缀为.so,静态库的后缀为.lib。...二、动态库的创建与使用案例 2.1 创建动态库 创建动态库的语法格式: gcc -fPIC -shared -o 库文件名称>.so 源文件名称.c 库文件名称>如何命名?...说明: 默认情况下系统搜索动态库的路径是/lib 、 /usr/lib 方法1: 直接将动态库拷贝到/lib 或者 /usr/lib 目录下。 [wbyq@wbyq linux_c]$ ..../a.out 三、静态库创建与使用 3.1 创建静态库 注意: 动态库如果静态库名字重名的时候,编译器优先使用动态库....例如: ar crv libmylib.a my_print.o my_math.o 3.2 如何使用静态库 [wbyq@wbyq linux_c]$ cd sum/ [wbyq@wbyq sum]$

    5.5K30

    linux动态库和静态库的使用_静态库的使用

    认识动静态库 在Linux下创建文件编写以下代码,并生成可执行程序。...在Linux下,我们可以通过ldd 文件名来查看一个可执行程序所依赖的库文件。...此时我们可以看到,libc-2.17.so实际上就是一个共享的目标文件库,准确来说,这还是一个动态库。 在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。...说明一下,使用该动态库的方法与刚才我们使用静态库的方法一样,我们既可以使用 -I,-L,-l这三个选项来生成可执行程序,也可以先将头文件和库文件拷贝到系统目录下,然后仅使用-l选项指明需要链接的库名字来生成可执行程序...这时我们需要使用ldconfig命令将配置文件更新一下,更新之后系统就可以找到该可执行程序所依赖的动态库了。

    4.8K20

    Linux 下如何使用nethogs

    说明: 有很多适用于Linux系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况. netstat用来查看接口统计报告,还有top监控系统当前运行进程.但是如果你想要找一个能够按进程实时统计网络带宽利用率的工具...简单地说,可以通过nethogs查看linux下进程的流量。 安装: 编译安装nethogs依赖包,centos默认rpm仓没有nethogs的包,所以需要我们手动编译。...nethogs编译依赖2个库,在编译前需要安装下 #yum install libpcap libpcap-devel 2.下载nethogs最新版,这个是截止到2015年9月23日能看到的最新包 #...Nethogs: Check Network Usage by Process Using Linux Pstree to display process parent-child relationship...关于NetHogs命令行工具的完整参数列表,可以参考NetHogs的手册,使用方法是在终端里输入man nethogs。

    3.2K00

    linux 动态库加载_linux默认动态库加载路径

    当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不到动态库...假设我们使用tensorflow,把需要调用的libtensorflow.so和libtensorflow_framework.so两个动态库放在我们和我们的程序同一级目录下。...,使用ldd命令查看一下: 为什么我们编译的时候明明指定了动态库的路径,而且程序编译的时候没有问题,执行的时候却找不到了呢?...1、因为我们在编译的时候使用-L指定动态库的路径,只是告诉编译器我们所需要的动态库在某个目录下,只对编译起作用 2、当程序执行时,程序还是回去系统的默认路径下寻找程序运行所需的动态库 所以在程序运行的时候会出现找不到动态库的问题...解决办法,使用-Wl,-rpath 所需动态库的路径 告诉程序如果在默认路径下找不到所需动态库,则去当前指定的路径下找动态库。

    11.8K20

    Linux 编译动态库_makefile编译动态库

    “libstr.so”; “-o libstr.so” 表示生成名字为“libstr.so.1”的实际动态链接库文件; 2.3 动态链接库的安装 生成动态链接库后,一个很重要的操作是安装,一般情况下,...将 动态链接库放到这三个中任意个目录都可以。 3. 动态链接库的配置文件 一般情况下,动态链接库不能随意使用。...搜索完毕后将结果写入到缓存文件“/etc/ld.so.cache”中, 文件中保存的是已经排好序的动态链接库名字列表,一般情况下里面的动态链接库很多,我们可以使用ldconfig -p命令来查看列表对应的动态库信息...使用动态链接库 在编译程序的时候,使用动态链接库和静态链接库是一致的, 使用“-l库名”的形式,编译器在生成可执行文件的时候会链接该链接库文件。...运行时的动态链接库需要放到系统搜索路径下。 6. 动态加载库的使用 动态加载库和动态链接库不同的是, 一般的动态链接库需要在程序启动的时候就要寻找动态链接库,找到库函数。

    6.2K20

    库的制作 与 使用 (Linux下)

    动静态库的制作 前置知识 要学会制作动态库,必须要有软硬链接知识的基础,大家可以移步至该文章:软链接和硬链接的详解 (Linux系统下)-CSDN博客 库的基本构造 问题 问题: 我们都知道代码有源文件...给编译后的文件(别人看不了你的代码实现)ψ(`∇´)ψ 也就是gcc -c 源文件名 -o 编译后的文件名.o后形成的文件,这样的文件属于二进制文件,别人看不了你的代码实现,但是计算机看得懂 如何更好的让别人使用...分为静态库和动态库,静态库以.a结尾,动态库以.so结尾 库的生成 静态库的生成 问题: 若我们有如下文件:myprint.c,mymath.c,myprint.h,mymath.h,请问我们要干什么呢...(还没有完哦) 库的使用 我们直接将刚刚制作的output文件夹给用户使用就好啦~~~ 自己制作的库的使用有三种办法 放进系统查找库函数的路径下(静态库) 导入环境变量(动态库) 放入...)ノ 要的是路径,不需要带上该动态库文件名 (´▽`ʃ♡ƪ) 弊端 xshell退出后这个环境变量中就没有我们加的路径了,因为这是内存级环境变量,所以这种方法不适用于长期使用的库 法三:放入配置文件

    9710

    Linux下如何安装使用puppeteer

    前提: 我需要用puppeteer实现抓取并下载百度图片中指定关键词的前100张图片, 程序在本地(Windows)下可以正常运行, 但是部署到服务器(Linux)上 就总是报错:cannot find...诸如此类的报错,虽然知道是和puppeteer的安装有关, 但是一直没找到如何在Linux下正确的安装(Windows下如果使用npm安装不成功,可以使用cnpm安装), 以下是在掘金上找到的一个方法,...亲测有效,记录一下。...1、先将项目上传到Linux下,然后先npm install安装项目所需依赖,会报错cannot find module 'puppeteer',接下来开始安装puppeteer 2、忽略Chromium...-%d,然后解压即可 ps: .local-chromium/linux-%d文件夹需要自己创建,同样将%d替换为具体编号 4、安装相关依赖(测试的时候不安装也正常运行了……) #依赖库 yum install

    15.3K10

    在Linux下如何使用shell操作数据库

    在Linux下如何使用shell操作数据库 作者:幽鸿   Jul 17, 2015 3:43:49 PM    我们一般在Windows下采用客户端连接数据库,也有直接在Linux下连接数据库的...但是,当我们想对数据库进行自动化管理的时候,比如:想通过shell脚本来管理数据库,那么该如何操作呢?本文以MySql为例,讲述两种常用的方法。     第一种方法,采用Linux管道方法。...这种方法通过Linux管道|将我们要执行的操作转入到登录后的MySql数据库中。     第二种方法,直接采用mysql -e命令。...在方法一中的参数--database,其实也可以直接省掉,就像方法二中直接使用数据库名wftsplat。总体来说,这两种方法都比较简单可行。

    85530

    在linux下制作静态库和动态链接库的方法

    编译 gcc main.c -l xxx [-L 库路径] (如果不加-L则在标准库路径下查找) 运行 ./a.out 基本概念: 静态库又称为文档文件(Archive File)。...Linux中静态库文件的后缀为"a"。 静态库的代码在编译时就已经链接到应用程序中 静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。...,加上-lpthread可以链接到linux标准线程库 总结: 使用静态库可以使程序不依赖于任何其他库而独立运行,但是会占用很多内存空间以及磁盘空间, 而且如果库文件更新,则需重新编译源代码.../a.out 如果不指定则在标准路径下找 当你发布库要标准路径“/usr/lib 或 /lib”就不需要其它操作,但 gcc 时一定要加“-l”指定的库名 永久修改运行时的库查找路径...:表示要连接的库在当前目录中 -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称 LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径

    3.2K20

    【Linux】静态库和动态库

    制作静态库 (1)朴素方法 — 不打包 下面我们实现两个简单的方法,加法和减法的计算方法,使用头文件和源文件分开的形式呈现出来,例如: 那么这一堆头文件和源文件该如何形成一个静态库给别人使用呢?...使用静态库 (1)朴素方法 — 直接使用 上面我们可以形成静态库了,那么我们该如何使用别人的静态库呢?...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的库以及地址,符号表就是动态链接这些动态库的。...可以结合下图理解: 也就是说,库被加载后,要被映射到指定使用了该库的进程的地址空间中的共享区部分。那么我们可以保证每次都能将动态库映射到固定的地址空间吗?并不是的。...但是我们想做到让库在共享区的任意位置,都可以正确运行呢? 下面我们先了解一下,我们动态库中的方法是如何编址的,其实就是以 库名称+方法偏移量 来确定的。

    74710

    linux动态库和静态库

    http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/ Linux下静态库_库的基本概念;如何生成静态库动态库...ln -s libhello.so.1.0 libhello.so.1        ln -s libhello.so.1 libhello.so 1.3、静态库,动态库文件在linux下是如何生成的...libhello.so.1.0 hello.o 1.4、库文件是如何命名的,有没有什么规范: 在 linux 下,库文件一般放在/usr/lib和/lib下, 静态库的名字一般为libxxxx.a...可以使用 ar q libname.a xxx1.o xxx2.o xxx3.o ... xxxn.o 生成静态库 1.9、如何查看动态库和静态库是32位,还是64位下的库: 如果是动态库,可以使用...linux系统的动态库有两种使用方法:运行时动态链接库,动态加载库并在程序控制之下使用。 1、为什么在不停程序的情况下,直接用 cp 命令替换程序使用的 so 文件,会使程序崩溃?

    12.4K20
    领券