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

linux 下用什么封装so

在Linux下,封装共享库(.so文件)通常使用GNU编译器集合(GCC)提供的工具链来完成。以下是封装共享库的基础概念、优势、类型、应用场景以及相关命令和步骤。

基础概念

共享库(Shared Library)是一种允许多个程序同时使用的库文件。在Linux系统中,共享库文件通常以.so(Shared Object)为扩展名。它们提供了一种方式,使得程序可以在运行时动态链接到库代码,而不是在编译时静态链接。

优势

  1. 节省磁盘空间:多个程序可以共享同一个库文件,而不是每个程序都包含一份副本。
  2. 便于更新和维护:只需更新共享库本身,而不需要重新编译所有依赖它的程序。
  3. 提高性能:动态链接允许操作系统在多个程序之间共享库的内存映像。

类型

  • 静态库:以.a为扩展名,编译时链接到程序中。
  • 动态库:以.so为扩展名,运行时链接到程序中。

应用场景

  • 大型软件系统:多个模块或组件共享相同的代码库。
  • 插件系统:允许第三方开发者编写扩展功能的插件。
  • 跨平台兼容性:通过共享库实现不同操作系统之间的代码复用。

封装步骤

假设你有一个C语言源文件example.c,你想将其编译成共享库libexample.so

  1. 编写源代码
  2. 编写源代码
  3. 编译生成目标文件
  4. 编译生成目标文件
  5. -c选项表示只编译不链接,-fPIC选项生成位置无关代码(Position Independent Code),这是生成共享库所必需的。
  6. 创建共享库
  7. 创建共享库
  8. -shared选项指定生成共享库,-Wl,-soname,libexample.so设置共享库的“soname”,这是一个用于版本控制的标识符。
  9. 使用共享库: 编写一个测试程序main.c来调用共享库中的函数:
  10. 使用共享库: 编写一个测试程序main.c来调用共享库中的函数:
  11. 编译并链接测试程序:
  12. 编译并链接测试程序:
  13. -L.指定库搜索路径为当前目录,-lexample链接名为libexample.so的库。
  14. 运行程序: 确保动态链接器能找到你的共享库。可以通过设置LD_LIBRARY_PATH环境变量来实现:
  15. 运行程序: 确保动态链接器能找到你的共享库。可以通过设置LD_LIBRARY_PATH环境变量来实现:

常见问题及解决方法

  1. 找不到共享库
    • 确保LD_LIBRARY_PATH包含库文件所在的目录。
    • 使用ldconfig命令更新缓存。
  • 版本冲突
    • 使用合适的soname和版本号管理策略。
    • 避免不同版本的库文件混用。

通过以上步骤,你可以在Linux下成功封装和使用共享库。如果遇到具体问题,可以根据错误信息进行排查和解决。

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

相关·内容

linux 什么是SO文件

so其实就是shared object的意思。今天看了上面的博客,感觉好吃力。赶紧做个笔记记录一下。...下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...2.怎么生成以及使用一个so动态库文件? 3.地址空间,以及线程安全. 4.库的初始化,解析: 5.使用我们自己库里的函数替换系统函数: 1.so文件是什么?...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。

5.8K20
  • linux下的so、o、lo、a、la文件的区别

    使用libtool解决编译问题看上去没什么问题:库的名称、路径、依赖都得到了很好的解决。但下结论不要那么着急,一个显而易见的问题就是:并不是所有的库都是用libtool编译的。...由于liba.so依赖于libb.so(这种依赖可以用readelf读liba.so的ELF文件看到),而上面的命令行中,并没有出现libb.so,于是,可能会出现问题。...说“可能”,是因为如果在本地编译的情况下,gcc在命令行中找不到一个库(比如上面的liba.so)依赖的其它库(比如libb.so),链接器会按照某种策略到某些路径下面去寻找需要的共享库: 1....$ unicore32-Linux-gcc –o myprog /usr/lib/liba.so \ -Wl,–rpath-link -Wl,/home/UNITY_float/install/usr/...libtool中有一个变量“hardcode_libdir_flag_spec”,该变量本来是传递“-rpath”选项的,但我们可以修改它,添加我们需要的路径,传递给unicore32-linux-gcc

    9K30

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

    静态库和动态库的最大区别,静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。...  hello.o  libHello.a  main.cpp  Out1 hc@linux-v07j:~/weiming/tt> ldd Out1         linux-gate.so.1....6 => /lib/libc.so.6 (0xb7ce3000)         /lib/ld-linux.so.2 (0xb7f1b000) 二: 动态库 这类库的名字一般是libxxx.so...替换-shared选项 调用动态库 隐式调用动态库 /**************  main.cpp *********************/ void print(); //或者用#.../libd.so (或者g++ -o dOut main.cpp -L./ -ld) hc@linux-v07j:~/weiming/tt/dd> ldd dOut         linux-gate.so

    17.3K21

    为什么在 Windows 下用 Ctrl+Z 退出 Python 而 Linux 下用 Ctrl+D 呢?

    Linux 下进入了 python 交互模式 当我们想退出 python ,返回我们的 shell 时,你将如何退出?...而这个操作在 Windows 和 Linux 两个平台是不同的——前者使用 Ctrl + z 而后者使用 Ctrl + d 。但是,为什么不同呢?...EOF 实际上就是 -1 : #define EOF (-1) C 语言之父肯·汤普森与丹尼斯·里奇恰好也是 Unix 的缔造者,而 Unix 深远地影响了操作系统的发展:无论是 Windows 还是 Linux...测试平台 AcWing 但注意,-1 并不是数值对象,而就是 -1 这个输入值,我们无法通过键盘上的 -1 直接键入,如果想要键入 -1 ,那么就需要: 在 Windows 上键入 Ctrl + z 在 Linux...上键入 Ctrl + d 所以,你也就知道为什么 在 Windows 下用 Ctrl+Z 退出 Python 而 Linux 下用 Ctrl+D 了吧!

    2.6K20

    Linux下so动态库一些不为人知的秘密

    基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 ? 这么多so,是的。...使用ldd显示的so,并不是所有so都是需要使用的,下面举个例子: main.cpp ? 使用缺省参数编译结果 ? 如果我链接一些so,但是程序并不用到这些so,又是什么情况呢?...所以必定会影响进程启动速度,所以我们最后不要把无用的so编译进来,这里会有什么影响呢?...呵呵,办法很简单省事吧,本文主要讲so依赖的一些问题,下面将介绍so的路径方面一些不为人知的小秘密。 库路径不为人知的小秘密 我们知道Linux链接so有两种途径:显示和隐式。...(0x00007f53ed30f000) 绝对路径虽然申请设置环境变量步骤,但是缺陷也是致命的,这个so必须放在绝对路径下,不能放到其他地方,这样给部署带来很大麻烦。

    4.2K20

    Linux core dump有什么用?

    进程崩溃时,Linux会将崩溃前进程的内存状态保存在core文件里,就像保存了案发现场的照片,可以帮助开发人员找到事故原因,修复程序。本文用简单的例子讲解如何根据core文件,定位进程崩溃的原因。...用ulimit -a查看系统对core文件的设置 ? core file size设置是0,也就是不允许core文件产生。 修改配置,改为unlimited,对大小不做限制。 ?...gdb下执行bt和where可以看见令程序崩溃的代码位置,但是现在只能看见main函数,看不见其它具体信息。这是因为编译代码时没有加入调试信息,g++加入调试信息的参数是-g ? ?...file core.* 可以正确指出core文件出自哪个可执行文件(无论可执行文件是什么,哪怕是java,Python,都是一样的操作),然后gdb 可执行文件 core.*,可以查看错误原因。 ?

    6.2K11

    按下开机键,Linux做了什么?

    Windows和Linux各自有自己内核。狭义的操作系统就是指内核,广义的操作系统包括内核以及内核之上的各种应用。 (Linus Torvalds与其说是Linux之父,不如说是Linux 内核之父。...他依然负责Linux 内核的开发和维护。至于Ubuntu, Red Hat, 它们都是基于相同的内核之上,囊括了不同的应用和界面构成的一个更加完整的操作系统版本。)...小结:BIOS -> MBR -> 引导加载程序 -> 内核 内核 如果我们加载的是Linux内核,Linux内核开始工作。...它是Linux系统中的1号进程(Linux系统没有0号进程)。到此,内核就完成了在计算机启动阶段的工作,交接给init来管理。...在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在的错误) 随后,init会运行一系列的初始脚本(startup scripts),这些脚本是Linux中常见的shell scripts

    1.4K30

    linux下用tar进行数据备份

    豌豆贴心提醒,本文阅读时间7分钟 本机上数据的手工备份 Linux系统上配有功能强大的tar命令,可以灵活地备份数据。...tar非常易于使用稳定可靠,而且在任何 Linux系统上都有这个命令。因此是最经常使用的备份工具。...Linux为我们提供了强大的工具来进行自动备份。这就是cron。 cron是一个后台进程,一旦启动,将根据自己的配置文件定时地执行任务。...每行由6个域组成: 分钟小时每月的天月星期命令 上述6个域之间用空格或Tab分开,其中: 分钟:分钟域,值的范围是0到59 小时:小时域,值的范围是0到23 每月的天:日期,值的范围是1到31 月份:月份...好了,这样只要Linux服务器不关机,每天凌晨3:00cron都会自动启动backup.sh脚本来对数据进行备份的。你就可以高枕无忧了。

    2.6K80

    Windows下用Bochs编译运行Linux-0.11

    点击打开链接http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040329.zip 2、解压linux-0.11-devel-040329.zip...4、安装完毕后,将所有linux-0.11-devel-040329下的文件,拷贝到刚才安装bochs下的根目录。原目录如下: ? ? 拷贝过后目录为: ?...这已经是x86PC模拟器上,搭建完成的Linux操作系统。建立linux操作平台命令,就能操作Linux。...由于学习操作系统需要,我们需要在Linux下,编译操作系统以及完成简单的源码修改,从而达到理解Linux内核的能力。接下来,主要演示Linux内核源码的修改,以及内核的编译过程。...3、依次修改:/linux/Makefile、/linux/fs/Makefile、/linux/lib/Makefile、 /linux/kernel/Makefile、/linux/kernel/

    3.8K20
    领券