共享库so
一、共享库的概念
首先在windows下,共享库拓展名使用dll;那么在linux 下也存在共享库的概念,即为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:.
如下所示:
注意:在添加成功后,进入底行模式,保存退出,要向它生效即起作用,必须再执行:
. .bash_profile
如下所示:
(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文件:
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<stdio.h>
2 #include<stdlib.h>
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编译及执行结果
第二次测试:
1 #include<stdio.h>
2 #include<stdlib.h>
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,只能供当前用户使用, 其他用户不可使用;
实践是检验真理的唯一标准:
还没有评论,来说两句吧...