.so文件的基本理解,使用。

一. 基本概念

Linux下的.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件。

  • 代码编译,链接,最后生成可执行文件;这个可执行文件就可看作是一个静态链接,因为代码里所有的函数变量都在这个可执行文件中。但这样会带来一个问题,就是如果项目的工程过大,写了太多的函数,但在程序的实际运行过程中,这些函数不一定都会用到,就会导致内存的大大的浪费,可能你的可执行文件有10M,但是只用了1M,其余部分都没用。于是动态链接库应运而生。不过windows下文件是.dll,而linux下叫.so。
  • 动态链接库有啥好处呢?参考链接(https://www.cnblogs.com/liuzhenbo/p/11031052.html

1. 可以实现进程之间的资源共享。

什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。

2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。

3. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。

程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。

二 简单示例

参考https://blog.csdn.net/m0_37844072/article/details/112802168,建立好文件工程(makefile可不要),依次执行以下步骤即可看到main.c链接了test1,test2生成的.so文件。并打印出了相关内容。

#step1 : 编译文件生成动态库

gcc test1.c test2.c -fPIC -shared -o libtest.so  
#将test1.c,test2.c生成libtest.so动态库
#-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)
#step2:链接.so生成可执行文件main

gcc main.c -L. libtest.so -o main  
#编译main.c时链接libtest.o 输出名为main的执行文件
#-L.代表libtest.so和main.c在同一位置
#step3 :查看实际调用

ldd main
#查看可执行文件main的依赖的动态库有哪些

-/main
#执行main文件

    原文作者:L7256
    原文地址: https://blog.csdn.net/m0_37844072/article/details/112857797
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞