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

linux 动态库 显式调用

Linux中的动态库(也称为共享库)是一种在程序运行时加载的库文件,它允许程序在多个进程之间共享代码和数据,从而减少内存占用和提高性能。显式调用动态库是指在程序中直接加载和使用动态库,而不是依赖于操作系统在程序启动时自动加载。

基础概念

  1. 动态库文件:通常以 .so(共享对象)为扩展名,例如 libexample.so
  2. 显式调用:通过编程方式在程序中加载和使用动态库,而不是依赖链接器在编译时自动处理。

相关优势

  • 灵活性:可以在运行时决定加载哪个库,便于程序的扩展和维护。
  • 减少内存占用:多个程序可以共享同一个动态库实例,节省内存。
  • 易于更新:只需替换库文件,无需重新编译依赖它的所有程序。

类型

  • 静态库:在编译时链接到程序中,文件通常以 .a 结尾。
  • 动态库:在运行时加载,文件通常以 .so 结尾。

应用场景

  • 插件系统:允许程序在运行时加载外部功能模块。
  • 跨平台兼容性:通过动态加载不同平台的实现库,提高软件的可移植性。
  • 大型软件系统:将功能模块化,便于管理和维护。

示例代码

以下是一个简单的C语言示例,展示如何显式调用动态库:

动态库代码 (example.c)

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

void hello() {
    printf("Hello from dynamic library!\n");
}

编译生成动态库:

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

主程序代码 (main.c)

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

int main() {
    void* handle;
    void (*hello)();

    // 打开动态库
    handle = dlopen("./libexample.so", RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }

    // 获取函数指针
    *(void**)(&hello) = dlsym(handle, "hello");
    const char* dlsym_error = dlerror();
    if (dlsym_error) {
        fprintf(stderr, "%s\n", dlsym_error);
        dlclose(handle);
        return 1;
    }

    // 调用函数
    hello();

    // 关闭动态库
    dlclose(handle);
    return 0;
}

编译主程序:

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

运行主程序:

代码语言:txt
复制
./main

遇到的问题及解决方法

问题1:找不到动态库文件

原因:动态库路径未包含在系统的库搜索路径中。 解决方法

  • 将库文件复制到系统库目录(如 /usr/lib/usr/local/lib)。
  • 在运行程序时设置 LD_LIBRARY_PATH 环境变量:
  • 在运行程序时设置 LD_LIBRARY_PATH 环境变量:

问题2:符号未定义

原因:动态库中没有找到指定的函数或变量。 解决方法

  • 确保动态库中确实定义了所需的符号。
  • 使用 nm 工具检查库中的符号:
  • 使用 nm 工具检查库中的符号:

问题3:版本不兼容

原因:动态库的接口发生变化,导致旧程序无法调用新库。 解决方法

  • 维护库的向后兼容性,避免破坏现有接口。
  • 使用版本号命名库文件,如 libexample.so.1

通过以上方法,可以有效管理和解决Linux动态库显式调用过程中遇到的问题。

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

相关·内容

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 创建静态库 注意: 动态库如果静态库名字重名的时候,编译器优先使用动态库.

5.5K30

嵌入式linux之go语言开发(二)c动态库驱动调用

c的代码及动态库调用: 最终需要完成的封装有:串口驱动,扫码模块,语音播放库,UI显示库,卡库... 一、串口及扫码模块驱动: linux上的串口驱动,这个较简单,有标准的模块可用。...都用到了标准的linux串口。只不过二维码模块的供电需要先开启IO口 这个已经验证,串口和二维码的串口都是ok了。可以使用。...363232373239323838383932303636343737320d0a 2018/11/03 11:48:52 <-收到串口信息,len=21 二、语音模块驱动 语音模块涉及到的头文件为pcm-ctrl.h,动态库为...press any key to continue: 三、界面显示模块调用: 界面模块调用libucgui.so,其中遇到了一些问题,最后也一一解决了,比如如何向go传递结构体等, UTF8汉字编码转...感觉网上使用libconv库的转码方案,受限于环境,不太好用。没时间再去找原因了,于是换了一种库 最终的解决办法是:使用Mahonia,字符编解码库解决 UTF8转gbk编码问题。

2.2K30
  • Linux下关于动态库的说明 | 编译以及调用

    动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库。其加载方式与静态库截然不同。...---- 动态库的命名 ​ Linux下,动态库通常以.so(shareobject)结尾。...即,程序只在执行启动时才加载动态库,如果删除动态库文件,程序将会因为无法读取动态库而产生异常。...注意 ​ 调用动态库的时候有几个问题会经常碰到,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的...在linux下可以用export命令来设置这个值,在linux终端下输入: export LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH

    2.2K40

    C 调用 Go 动态库

    在本文中,我们将学习如何将 Go 代码编译成 C 动态库,并通过 C 程序调用 Go 动态库中的函数。...我们将逐步介绍如何生成 Go 动态库,如何编写 C 程序来调用 Go 函数,以及如何在 C 程序中链接 Go 生成的共享库。1. 目标将 Go 函数编译成 C 动态库(共享库)。...在 C 程序中加载并调用 Go 动态库中的函数。2. 环境准备确保你的系统已经安装了以下工具:Go 语言:确保安装了 Go 1.11 或更高版本。GCC:用于编译 C 代码并链接 Go 动态库。3....编写 C 程序调用 Go 动态库现在,我们编写一个 C 程序,使用 #include 指令包含 Go 动态库的头文件,并调用其中的 Add 函数。...然后,调用 Go 动态库中的 Add 函数,并输出结果。5. 编译并链接 C 程序我们需要编译 C 程序并链接 Go 生成的共享库。

    9310

    java 调用 dll动态库

    检查dll动态库 通过软件 DependenciesGui.exe 检查CloseLoopCalDll.dll动态库 动态库缺少依赖 图片 注意点:缺陷dll核心依赖,加载的时候会报错缺少依赖,如果是...Windows系统依赖缺失并且dll算法并没有调用此依赖时,是可以加载成功的 动态库打包错误 注意点:dll虽然可以成功加载,但是由于动态库的打包错误,相应的方法是找不到。...正确的动态库 java程序加载dll动态库 导入依赖 //jna implementation group: 'net.java.dev.jna', name: 'jna' 按路径加载 private...请确认操作系统是否能解析文件", file); } } } 注意点:加载dll动态库可以自己创建类和方法去实现 调用dll动态库 创建接口类 public...dll动态库 //很关键 设置字符集,字符集不匹配无法调用dll System.setProperty("jna.encoding", "GB2312"); Native.setProtected(true

    4.5K10

    嵌入式Linux下LCD应用编程: 调用giflib库解码显示GIF动态图

    PNG格式图片显示,直接调用libpng库里的接口函数解码显示;JPG格式图片也一样,调用libjpeg库的接口函数完成解码即可得到原始RGB数据完成显示;如果要在LCD屏上显示GIF图片,那么也是调用...giflib库的接口函数完成解码显示。...三、移植giflib库到嵌入式Linux平台 giflib库下载地址: http://www.linuxfromscratch.org/blfs/view/svn/general/giflib.html...,方便程序编译时直接可以找到头文件和库文件;当前,也可以在程序编译的时候在编译器后面指定gif使用的头文件和库文件也可以。...再将动态库文件拷贝一份到目标开发板的lib目录下,方便程序在开发板上运行时能找到对应的库。

    3.1K22

    c#封装动态库_nginx调用so动态库

    3)在运行时可以动态地选择加载各种应用程序模块 下面重点介绍Windows下动态链接库DLL. DLL即动态链接库(Dynamic-Link Libaray)的缩写,相当于Linux下的共享对象。...(1)导出与导入 在ELF(Linux下动态库的格式),共享库中所有的全局函数和变量在默认情况下都可以被其他模块使用,即ELF默认导出所有的全局符号。...DLL不同,需要显式地“告诉”编译器需要导出某个符号,否则编译器默认所有的符号都不导出。 程序使用DLL的过程其实是引用DLL中导出函数和符号的过程,即导入过程。...应用程序使用DLL可以采用两种方式:一种是隐式链接(调用),另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息 。...5.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。

    2.8K20

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

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

    11.8K20

    Delphi调用动态链接库

    调用动态库的两种方法 静态调用 这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中...代码演示 我们先创建一个动态链接库名称为PosPayIntf,最近几章介绍Delphi技术的都是用这个动态库,因为正好因为项目要做一个对接第三方微信支付宝的动态库。 ?...这样我们在调用的时候就直接可以使用 ? 用静态调用动态库相对来说代码比较少,但是我们的动态库必须要放到和这个EXE的程序下,如果DLL文件没有存在,程序则无法运行,提示你少DLL文件。...我们在调用动态库方法的按钮事件里面直接定义一个THandle和一个TPublicFun,TPublicFun撒向的就是我们的入口函数 ? 然后通过LoadLibrary来加载动态库 ?...调用的方式和静态调用一样 ? 最后用try finally来释放一下动态库 ? 这样就完成了,动态调用的方法不影响我们主程序的运行,只有在用到的时候才会调作它,推荐使用这个方法。

    2.6K20

    C++动态库和静态库_动态库和静态库调用方法

    动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。...4、文件形式 Tables Windows Linux 静态库 .lib Libxxx.a 动态库 .dll与.lib libxxx.so 5、生成和加载方式 这里我仅讨论windows下的使用vs...而静态库中的lib包含了索引和实现。 加载动态库 加载动态库有两种方式,分为隐式加载和显示加载。 隐式加载 所需文件:接口.h头文件,dll文件,lib文件。...隐式加载和显示加载区别很明显,显示加载使用灵活,需要时加载,用完卸载,而隐式加载伴随着整个程序的生命周期。 6、总结 库分为静态库和动态库。静态库与可执行文件打包,动态库与可执行文件独立。...静态库加载需要.lib和.h文件。动态库隐式加载需要.dll、.h、.lib文件,显示加载只需要.dll文件。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    3.2K20

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

    动态链接库简介 动态库又叫动态链接库,是程序运行的时候加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。...动态库是目标文件的集合,目标文件在动态库中的组织方式是按特殊的方式组织形成的。在动态库中函数和变量的地址是相对地址而不是绝对地址,其真实地址在调用动态库的程序加载时形成的。...系统中的配置文件/etc/ld.so.conf便是动态链接库的搜索路径配置文件。在这个文件内存放着可以被Linux共享的动态链接库所在目录的名字(系统默认的/lib, /usr/lib除外)。.../usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/mesa-egl /usr/lib/x86_64-linux-gnu/mesa # Legacy...使用ldconfig命令默认情况下不输出扫描的结果信息,它的作用是更新系统默认搜索路径和配置文件中制定的搜索路径,然后将扫描结果缓存到“/etc/ld.so.cache”中,供运行程序快速访问调用。

    6.2K20

    【C 语言】动态库封装与设计 ( Windows 动态库简介 | Visual Studio 调用动态库 )

    文章目录 一、Windows 动态库简介 二、Visual Studio 调用动态库 一、Windows 动态库简介 ---- 在 C:\Windows\System32 目录中 , 存放着 Windows...中的动态库 ; 在 Visual Studio 项目中 , 选择 " 菜单栏 / 生成解决方案 " 选项 , 在项目的根目录中 , 生成 Debug 目录 , 在目录下生成了如下文件 : xxx.lib...是资源描述文件 , 用于描述 xxx.dll 动态库的 ; xxx.dll 动态库 中包含了 函数的 二进制机器码 , 也就是 函数体 代码 ; Windows 中 ( .dll 动态库 ) 与 Linux...中 ( .so 动态库 ) 动态库规范不同 ; 二、Visual Studio 调用动态库 ---- 拷贝动态库文件 : 将编译出的 xxx.lib 和 xxx.dll 文件 , 拷贝到 Visual...链接器 / 输入 / 附加依赖项 " , 选择编辑 " 附加依赖项 " ; 输入 拷贝到源码路径的 xxx.lib 名称 , 目的是让编译器通过该 xxx.lib 文件查找对应的 xxx.dll 动态库文件

    1.2K30

    【Linux】静态库和动态库

    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...假设我们是超级用户,允许给目录建立硬链接,给根目录建立硬链接,从根目录开始查找,当查找硬链接的时候就是根目录,这时候递归式查找,形成了环路查找,最后导致软件无法正常进行查找工作!...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...程序运行的时候将不再需要静态库 动态库(.so):库文件以.so为后缀,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...链接的本质:无非就是我们调用库函数的时候和标准库是如何关联的问题 库的名称:去掉前缀lib去掉后缀.so/.a剩下的就是库名称,比如libc.so就是C库 gcc 在编译时默认使用动态链接,而生成静态链接

    32230

    【Linux】静态库和动态库

    如果我们将头文件和库文件都安装到系统中了,-I 和 -L 就不需要带了。 二、动态库 1. 动态库概念 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 2....使用动态库 接下来我们按照使用静态库的方式尝试使用动态库,首先先生成可执行程序: 接下来我们开始运行: 我们会发现,报错了,报的是不能打开该动态库,找不到该文件或目录。这是为什么呢?...另外,如果别人给我们的库中既包含动态库也包含静态库,即同一个库中提供动静态两种库,gcc 默认使用动态库!...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的库以及地址,符号表就是动态链接这些动态库的。...假设我们的可执行程序中 main 函数的起始地址为 0x11111111;然后我们的代码中还调用了其它方法,假设有两个方法,地址分别为 0x2222 和 0x3333,如下图: 而上面的地址可以说是虚拟地址

    74610

    linux动态库和静态库

    1.2、 库的种类  linux 下的库有两种:静态库和共享库(动态库)。...动态通常用.so为后缀, 例如:libhello.so 共享库(动态库)的好处是:: 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。...可以看到 ln 命令依赖于 libc 库和 ld-linux 库 1.7、使用nm工具,查看静态库和动态库中有那些函数名; (T类表示函数是当前库中定义的,U类表示函数是被调用的,...调用动态库的时候,有几个问题会经常碰到: 1、有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时...在Linux下,动态库和静态库同事存在时,gcc/g++的链接程序,默认链接的动态库。

    12.4K20

    【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一、在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二、拷贝 xxx.lib、xxx.dll、xxx.h 到源码路径 三、导入 xxx.h 头文件 四、配置动态库引用...五、调用动态库中的函数 一、在 Visual Studio 2019 中创建 " 控制台应用 " 程序 ---- 欢迎界面中 , 选择 " 创建新项目 " , 选择创建 " 控制台应用 " 项目类型...描述文件 xxx.lib , 动态库文件 xxx.dll , 动态库头文件 xxx.h , 拷贝到 项目的源码路径中 , 注意就是主函数源码所在的目录 ; 三、导入 xxx.h 头文件 ---- 在..., 在弹出的菜单中 , 选择 " 属性 " , 选择 " 配置属性 -> 链接器 -> 输入 -> 附加依赖项 " 的 " 编辑 " 选项 , 将 xxx.lib 选项 , 拷贝到此处 ; 五、调用动态库中的函数...导入头文件 , 即可调用动态库中的函数 ;

    2.2K30
    领券