共享库so

谁践踏了优雅 2022-05-28 06:39 344阅读 0赞

一、共享库的概念

首先在windows下,共享库拓展名使用dll;那么在linux 下也存在共享库的概念,即为so文件。
《1》示意图
SouthEast

《2》so文件说明
《1》so源文件中没有main( ),即便是有,也不会执行;
《2》编译时,gcc -fPIC,可使产生与位置无关的代码;
《3》链接时,gcc -shared指示生成共享库文件
《4》共享库文件名要以lib开头,文件扩展名为.so
eg:libtest.so
《2》so文件的使用方法
1、为了让用户在linux 中找到so文件的位置,有两种方法;
(1)需要在.bash_profile中添加相关的路径:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
如下所示:
SouthEast 1
注意:在添加成功后,进入底行模式,保存退出,要向它生效即起作用,必须再执行:

. .bash_profile

如下所示:
SouthEast 2
(2)或者将so 文件直接加载到/user/lib/中;但是这种方式不推荐使用,因为/user/lib/这个是linux的系统库,如果将自己定义的so文件放在这里,这就好像在windows中自己写了一个小的应用程序,自己把它存在c盘中一样,故不太合适;
2、在.c中要使用so文件,首先得声明相关的头文件
3、gcc链接时,要使用-L 和-l+文件名;
如:gcc -L -ltest -o a a.c
-L代表到当前目录下找.so文件,
-ltest链接到libtest.so这个库文件,
a代表编译后的可执行文件名为a;

二、实例说明

$ vim so.c

  1. int max (int a, int b)//两数比较大小函数
  2. {
  3. if(a > b)
  4. return a;
  5. else
  6. return b;
  7. }
  8. int add(int a , int b)//实现两个数相加函数
  9. {
  10. return a + b;
  11. }

$vim makefile
SouthEast 3

编译so文件:
SouthEast 4

so的头文件$ vim so.h

  1. 1
  2. 2 #ifndef SO_H_
  3. 3 #define SO_H
  4. 4
  5. 5 int max(int a, int b);
  6. 6 int add(int a ,int b);
  7. 7
  8. 8
  9. 9 #endif/*SO_H_*/

创建一个a.c文件
$vim a.c

  1. 1 #include<stdio.h>
  2. 2 #include<stdlib.h>
  3. 3 #include "so.h"
  4. 4
  5. 5 int main(int arg,char *args[])
  6. 6 {
  7. 7 printf("max = %d\n",max(4 ,5 ));
  8. 8
  9. 9 printf("add = %d\n",add(4 ,5 ));
  10. 10 return 0;
  11. 11 }
  12. //保存退出,进行编译

a.c的makefile文件如下

  1. 1 .SUFFIXES:.c .o
  2. 2 CC=gcc
  3. 3 SRCS=a.c
  4. 4
  5. 5 OBJS=$(SRCS:.c=.o)
  6. 6 EXEC=a
  7. 7
  8. 8 all:$(OBJS)
  9. 9 $(CC) -L. -lso -o $(EXEC) $(OBJS)
  10. 10 @echo ' ^-^ ^-^ ^-^ ^-^ ^-^ ok ^-^ ^-^ ^-^ ^-^'
  11. 11 .c.o:
  12. 12 $(CC) -Wall -g -o $@ -c $<
  13. 13 clean:
  14. 14 rm -f $(OBJS)
  15. 15 rm -f core*

a.c编译及执行结果
SouthEast 5
第二次测试:

  1. 1 #include<stdio.h>
  2. 2 #include<stdlib.h>
  3. 3 #include "so.h"
  4. 4
  5. 5 int main(int arg,char *args[])
  6. 6 {
  7. 7 printf("max = %d\n",max(4 ,5 ));//应返回5
  8. 8
  9. 9 printf("max = %d\n",max(42 ,5 ));//应返回42
  10. 10
  11. 11 printf("add = %d\n",add(40 ,50 ));应返回90
  12. 12
  13. 13 printf("add = %d\n",add(45 ,55 ));应返回100
  14. 14 return 0;
  15. 15 }

测试结果:
SouthEast 6
可见,我们得出的结果和预期一样,共享成功;

三、特别说明

在当前用户下创建的共享库so,只能供当前用户使用, 其他用户不可使用;
实践是检验真理的唯一标准:

SouthEast 7

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android加载so

    1. 说明    早期的Android系统几乎只支持ARMv5的CPU架构,你知道现在它支持多少种吗?7种! Android系统目前支持以下七种不同的CPU架构:AR

    相关 JNI调用dllso

    一、应用场景         如果想用Java调用C或C++程序,前提是给定了C或C++的动态库dll(Windows)或so(Linux)文件和函数头文件说明,根据头文

    相关 Android soHook技术

    在有些情况下,可能遇到需要改变目标进程的执行流程的问题,替换原函数转而指向我们自己的函数,而Hook就是指的改变待Hook函数的地址,替换地址而达到更换原函数的功能。本文主要介

    相关 共享so

    一、共享库的概念 首先在windows下,共享库拓展名使用dll;那么在linux 下也存在共享库的概念,即为so文件。 《1》示意图 ![SouthEast][