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

linux 怎么使用动态库

在Linux系统中,动态库(也称为共享库)是一种可被多个程序共享的库文件,它允许程序在运行时加载和使用库中的函数和数据。使用动态库可以提高程序的可维护性和可扩展性,同时减少内存占用。

基础概念

动态库:在Linux中,动态库通常以.so(共享对象)为后缀,例如libexample.so

相关优势

  1. 节省内存:多个程序可以共享同一个动态库实例。
  2. 易于更新:只需替换库文件,无需重新编译所有依赖它的程序。
  3. 灵活性:可以在运行时决定加载哪个库。

类型

  • 静态链接:在编译时将库代码直接嵌入到可执行文件中。
  • 动态链接:在运行时加载库文件。

应用场景

  • 大型软件系统:多个组件共享通用功能。
  • 插件架构:允许程序在运行时加载外部扩展。

如何使用动态库

创建动态库

假设我们有一个简单的C文件example.c

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

void print_hello() {
    printf("Hello from the library!\n");
}

编译生成动态库:

代码语言:txt
复制
gcc -shared -o libexample.so example.c

使用动态库

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

代码语言:txt
复制
// main.c
extern void print_hello();

int main() {
    print_hello();
    return 0;
}

编译并链接应用程序:

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

这里,-L.告诉编译器在当前目录查找库,-lexample指定链接libexample.so

运行程序

由于Linux默认不会在当前目录查找动态库,需要设置LD_LIBRARY_PATH环境变量:

代码语言:txt
复制
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./main

常见问题及解决方法

找不到动态库

原因:系统无法找到指定的动态库文件。

解决方法

  1. 确保库文件存在于指定路径。
  2. 设置LD_LIBRARY_PATH环境变量。
  3. 将库文件复制到系统库目录(如/usr/lib/usr/local/lib),并运行ldconfig更新缓存。

版本冲突

原因:不同版本的库文件可能导致符号冲突。

解决方法

  1. 使用版本化的库文件名(如libexample.so.1)。
  2. 在编译时指定库的完整路径。

示例代码

以下是一个完整的示例,展示了如何创建和使用动态库:

example.c

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

void print_hello() {
    printf("Hello from the library!\n");
}

main.c

代码语言:txt
复制
extern void print_hello();

int main() {
    print_hello();
    return 0;
}

编译和运行步骤

  1. gcc -shared -o libexample.so example.c
  2. gcc -o main main.c -L. -lexample
  3. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
  4. ./main

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

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

相关·内容

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

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

11.8K20
  • Linux 编译动态库_makefile编译动态库

    动态链接库简介 动态库又叫动态链接库,是程序运行的时候加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。...生成动态链接库 生成动态链接库的命令比较简单: 2.1 使用-shared 告诉编译器生成一个动态链接库 2.2 使用选项-fPIC或者-fpic,使得生成的代码与位置无关 gcc -shared -Wl...将 动态链接库放到这三个中任意个目录都可以。 3. 动态链接库的配置文件 一般情况下,动态链接库不能随意使用。...如果要在运行的程序中使用动态链接库,需要制定系统的动态链接库搜索路径,只有让系统能找到运行时需要的动态链接库才能使用它。...使用动态链接库 在编译程序的时候,使用动态链接库和静态链接库是一致的, 使用“-l库名”的形式,编译器在生成可执行文件的时候会链接该链接库文件。

    6.2K20

    linux动态库和静态库

    1.2、 库的种类  linux 下的库有两种:静态库和共享库(动态库)。...可以看到 ln 命令依赖于 libc 库和 ld-linux 库 1.7、使用nm工具,查看静态库和动态库中有那些函数名; (T类表示函数是当前库中定义的,U类表示函数是被调用的,...file *.so; 如果是静态哭,可以使用objdump -x *.a Linux下进行程序设计时,关于库的使用: 一、gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库...在Linux下,动态库和静态库同事存在时,gcc/g++的链接程序,默认链接的动态库。...linux系统的动态库有两种使用方法:运行时动态链接库,动态加载库并在程序控制之下使用。 1、为什么在不停程序的情况下,直接用 cp 命令替换程序使用的 so 文件,会使程序崩溃?

    12.4K20

    【Linux】静态库和动态库

    然后我们就可以将该库安装一下,怎么安装呢?...接下来我们就可以将该动态库给别人使用了,现在我们将该动态库拷贝到 user 目录下: 现在别人就可以使用我们的库了。 3....使用动态库 接下来我们按照使用静态库的方式尝试使用动态库,首先先生成可执行程序: 接下来我们开始运行: 我们会发现,报错了,报的是不能打开该动态库,找不到该文件或目录。这是为什么呢?...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的库以及地址,符号表就是动态链接这些动态库的。...替换掉,如下图: 所以进程在执行代码的时候,当识别到库中的方法时,该怎么找到库中的方法呢?

    74610

    【Linux】静态库和动态库

    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...程序运行的时候将不再需要静态库 动态库(.so):库文件以.so为后缀,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...my_add.o my_sub.o 使用动态库 但是这样子就可以吗?...,库也就具备了起始地址,通过偏移地址和起始地址这样就可以找到访问的函数: 系统层面上会维护动态库的起始地址,直接建立页表与内存的映射,也就可以跳转访问了,所以动态库加载一次就可以被多个进程共同使用了。

    32230

    怎样在 Linux 中使用动态和静态库

    Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。...动态链接指的是使用共享库。...为了检查一个应用在启动时需要哪些库,你可以使用 ldd 命令,它会打印出给定文件所需的动态库: $ ldd my_app linux-vdso.so.1 (0x00007ffd1299c000...动态加载 动态加载的意思是一个库(例如一个 .so 文件)在程序的运行时被加载。这是使用某种特定的编程方法实现的。 当一个应用使用可以在运行时改变的插件时,就会使用动态加载。...动态加载器:ld.so 在 Linux 系统中,你几乎总是正在跟共享库打交道,所以必须有个机制来检测一个应用的依赖并将其加载进内存中。

    2K21

    vs生成动态库及使用动态库

    动态库(.dll):动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。...动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。...DLL 是一个包含可由多个程序同时使用的代码和数据的库。Windows下动态库为.dll后缀,在Linux在为.so后缀。...使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。...3.生成解决方案,然后就可以在Debug目录下找到生成的库 ---- 动态库的使用 (要用前面生成的库文件和建立的头文件) 新建win32项目—>控制台应用程序—>空项目 1、添加工程的头文件目录:

    2.5K30

    Linux共享库、静态库、动态库详解

    介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?...1、静态函数库,是在程序执行前就加入到目标程序中去了 ; 2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)...理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数库)的程序运行速度上快一些,大概1-5%。...某些情况下,使用gcc 来生成object文件,需要使用“-Wl,-export-dynamic”这个选项参数。 通常,动态函数库的符号表里面包含了这些动态的对象的符号。...一种方法是使用glibc函数库中的对动态加载模块的支持,它使用一些潜在的动态加载函数库界面使得它们可以夸平台使用。

    8.9K11

    linux 动态库 静态库_静态库里面包含动态库

    动态库与静态库 文件系统补完 文件的三个时间acm 动态库与静态库 动态链接与静态链接 静态库与动态库 动静态库的对比 生成静态库 打包静态库 使用静态库 生成动态库 打包动态库 使用动态库 文件系统补完...可以使用:1.库,包括静态库与动态库。2.开源代码。3.基本的网络功能调用,比如各种网络接口、语音识别等等。 这其中,我们将详细介绍静态库和动态库。...程序运行的时候将不再需要静态库。 而动态库则是指程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...生成动态库 学习完生成和使用静态库后,下面我们来生成一下动态库。...此时make就制作好了动态库: 使用动态库 和静态库使用一样带上三个选项打包动态库: 这里我们在运行程序时可能会报错: error while loading shared libraries

    7.4K20

    Linux之动态库和静态库

    前言 一、动态库和静态库概念 在之前的文章中,介绍过动静态库的概念,因此这次我们只是简单回顾一下。 Linux中的库分为动态库和静态库。...动态库打包: gcc -shared -o libmymath.so add.o sub.o 使用动态库: 我们试着运行mymath: 为啥运行不了呢(为啥找不到库)?...所以动态库加载一次就可以被多个进程共同使用。...动态库相对于静态库更节省内存,静态库由多个程序使用相同的库函数,加载到内存中就会导致内存中有多份重复的库函数代码,而动态库则是多个程序共用一份动态库,不会导致出现重复的库函数代码,就节省了内存空间。...总结 以上就是今天要讲的内容,本文介绍了Linux中的动静态库的相关概念。

    59420

    Linux静态库与动态库加载

    在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。 在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。 认识了动态库,那静态库,又是什么呢?...动态库是和目标文件链接,具体怎么链接下面会讲,而静态库确不同,静态库是在编译的时候,将库中的代码直接拷贝到目标文件中,这就导致了我们最终形成的目标文件会很大,但优势在于形成了可执行程序后,该可执行程序可独立运行...,不再需要库,但动态库不行,在日常我们都会使用动态库,很少使用静态库。...注意上面我打包了两个库,虽然看后缀一个静态库,一个动态库,但是其实上述的库都是静态库,linux不是单单通过后缀来判断一个库的类型,下面就来看看如何真正打包一个动态库吧。...打包:使用-shared选项将所有目标文件打包为动态库 与生成静态库不同的是,生成动态库时我们不必使用ar命令,我们只需使用gcc的-shared选项即可。

    18510

    openssl怎么编译成动态库

    Windows下编译OpenSSL动态库的方法: 1、安装ActivePerl 初始化的时候,需要使用perl 2、使用VS下的Visual Studio 20xx Command Prompt...openssl的目录 4、执行:perl configure VC-WIN32 5、执行:ms/do_ms 6、选择不同的编译结果 1) 执行:nmake -f ms/ntdll.mak 该命令生成动态库...,默认使用的是MD 2) 执行:nmake -f ms/nt.mak 该命令生成静态库,默认使用的是MT 3) 想生成使用静态链接运行时库的动态库则采用下面方法 复制一个ntdll.mak并命名为...为/MT ,然后重新编译,执行 nmake -f ms/ntdll_mt.mak 4) 想生成使用动态链接运行时库的静态库则采用下面方法 复制一个nt.mak并命名为nt_md.mak,修改里面的...make && make install 2、动态库 1.config: #config no-asm --prefix=..

    80730

    linux编译curl库的动态库so

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  curl库是一个很强大的http开源库,c++里面能够很方便的和http服务器交互。...最近项目开始内测,开始接登录和充值的SDK,选择了使用curl库来和第三方http服务器交互。...在windows下还是很容易使用,如何使用的案例比比皆是,而且很容易就找到已经编译好的动态库进行测试,但是最后在linux下部署的时候,发现不好找已经编译好的so库文件,最后没办法只好自理更生。...我是使用腾讯的SDK里面附带的curl库的源码(ps,腾讯SDK的示例代码貌似没在linux测试过,我编译后使用他们的代码,发现很容易崩溃,需要修改才能运行,但是windows正常)。...包含了编译生产的库、头文件等。 然后为了能够方便的移植我们的程序,把include/lib下面的头文件和so库文件拷贝到自己的工程目录就能使用curl库了。

    6.5K10

    Linux下的静态库与动态库

    由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 2.库的种类 linux下的库有两种:静态库和共享库(动态库)。...3.库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。...动态库的后缀是.so,它由gcc加特定参数编译产生。...在linux下,库文件一般放在/usr/lib /lib下, 静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称 动态库的名字一般为libxxxx.so.major.minor,xxxx...库和ld-linux库 7.可执行程序在执行的时候如何定位共享库文件 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径 此时就需要系统动态载入器(dynamic linker

    9610
    领券