共享库so

一、共享库的概念

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

《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:.
如下所示:
共享库so_第2张图片
注意:在添加成功后,进入底行模式,保存退出,要向它生效即起作用,必须再执行:

. .bash_profile

如下所示:
共享库so_第3张图片
(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

int max (int a, int b)//两数比较大小函数
{
    if(a > b)
        return a;
    else
        return b;
}
int add(int a , int b)//实现两个数相加函数
{
    return a + b;
}

$vim makefile
共享库so_第4张图片

编译so文件:
共享库so_第5张图片

so的头文件$ vim so.h

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

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

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

a.c的makefile文件如下

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

a.c编译及执行结果
共享库so_第6张图片
第二次测试:

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

测试结果:
共享库so_第7张图片
可见,我们得出的结果和预期一样,共享成功;

三、特别说明

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

共享库so_第8张图片

你可能感兴趣的:(Linux)