永发信息网

linux中.so后缀的文件怎么使用啊

答案:5  悬赏:40  手机版
解决时间 2021-05-01 09:45
  • 提问者网友:且恨且铭记
  • 2021-04-30 23:00

我在linux中下载了个flashplayer,是.rar后缀的,我用rar解压后,生成一个.tar.gz后缀的文件,我再次解压之后只生成一个.so后缀的文件,请问这个.so后缀的文件怎么使用啊?

最佳答案
  • 五星知识达人网友:人類模型
  • 2021-05-01 00:08

这是LINUX系统应用的动态链接库,只不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。(在LINUX下,静态函数库是以.a作后缀的) X-WINDOW作为LINUX下的标准图形窗口界面,它本身就采用了很多的动态链接库(在/usr/X11R6/lib目录下),以方便程序间的共享, 节省占用空间。着名的APACHE网页服务器,也采用了动态链接库,以便扩充程序功能。你只需将PHP动态链接库拷到其共享目录,修改一下配置, APACHE就可以支持PHP网页了。如果你愿意,可以自己编写动态链接库,让APACHE支持你自己定义的网页格式。这就是动态链接的好处。


LINUX下动态链接库的使用


  2.1 重要的dlfcn.h头文件


  LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接库的函数的原型.下面详细说明一下这些函数.


  2.1.1 dlerror


  原型为: const char *dlerror(void);


  当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功.


  2.1.2 dlopen


  原型为: void *dlopen (const char *filename, int flag);


  dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄.


  filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件.


  (1) 用户环境变量中的LD_LIBRARY值;


  (2) 动态链接缓冲文件/etc/ld.so.cache


  (3) 目录/lib,/usr/lib


  flag表示在什么时候解决未定义的符号(调用).取值有两个:


  1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决.


  2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误.


  dlopen调用失败时,将返回NULL值,否则返回的是操作句柄.


  2.1.3 dlsym : 取函数执行地址


  原型为: void *dlsym(void *handle, char *symbol);


  dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址.由此地址,可以带参数执行相应的函数.


  如程序代码: void (*add)(int x,int y);


  add=dlsym("xxx.so","add");


  add(89,369);


  2.1.4 dlclose : 关闭动态链接库


  原型为: int dlclose (void *handle);


  dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载.2.2 在程序中使用动态链接库函数


  2.2.1 程序范例


  下面的程序装载了动态链接库my.so,并用getdate,gettime取得当前日期与时间后输出.


  ----------------------------------------------------------------------


  1


  2


  3


  4


  5


  6


  7


  8 #include "stdio.h"


  9


  10 #include "dlfcn.h"


  11 #define SOFILE "./my.so"


  12


  13 #define SHARED


  14 #include "datetime.h"


  15


  16 main()


  17 {


  18 DATETYPE d;


  19 TIMETYPE t;


  20 void *dp;


  21 char *error;


  22


  23 puts("动态链接库应用示范");


  24


  25 dp=dlopen(SOFILE,RTLD_LAZY);


  26


  27 if (dp==NULL)


  28 {


  29 fputs(dlerror(),stderr);


  30 exit(1);


  31 }


  32


  33 getdate=dlsym(dp,"getdate");


  34


  35 error=dlerror();


  36 if (error)


  37 {


  38 fputs(error,stderr);


  39 exit(1);


  40 }


  41


  42 getdate(&d);


  43 printf("当前日期: d-d-d\n",d.year,d.mon,d.day);


  44


  45 gettime=dlsym(dp,"gettime");


  46


  47 error=dlerror();


  48 if (error)


  49 {


  50 fputs(error,stderr);


  51 exit(1);


  52 }


  53


  54 gettime(&t);


55 printf("当前时间: d:d:d\n",t.hour,t.min,t.sec);


  56


  57 dlclose(dp);


  58


  59 exit(0);


  60


  61 }


  ----------------------------------------------------------------------




  程序说明:


  第8行: 包含标准输入输出头文件,程序中使用了printf,puts,fputs等标准输入输出函数,需要让编译器根据头文件中函数的原型,检查一下语法;


  第10-11行: 包含动态链接库功能头文件,并定义动态链接库名称;


  第13-14行: 定义宏SHARED以便引用14行的头文件datetime.h中的动态函数说明;


  第25行: 用dlopen打开SOFILE共享库,返回句柄dp;


  第27-31行: 检测dp是否为空,为空则显示错误后退出;


  第33行: 用dlsym取得getdate函数动态地址;


  第35-40行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;


  第42-43行: 执行getdate调用,输出当前日期;


  第45行: 用dlsym取得gettime函数动态地址;


  第47-52行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;


  第54-55行: 执行gettime调用,输出当前时间;


  第57行: 用dlclose关闭dp所指示的动态链接库;


  第59行: 程序退出,返回0值.


  2.2.2 编写维护文件


  维护文件makefile内容如下:


  ----------------------------------------------------------------------


  1 # makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.


  2


  3 all : dy


  4


  5 DYSRC = dy.c


  6


  7 DYTGT = $(DYSRC:.c=.o)


  8


  9 %.o : %.c


  10 cc -c $?


  11


  12 # 动态库应用示范程序


  13 dy : $(DYTGT)


  14 cc -rdynamic -s -o $@ $(DYTGT) -ldl


  15


  ----------------------------------------------------------------------


  维护文件说明:


  第3行: 定义所有需要维护的模块;


  第5行: 定义源程序;


  第7行: 定义目标文件;


  第9-10行: 定义.o文件依赖于.c文件,维护代码为“cc -c 变动的源文件名”;


第13-14行: 定义dy依赖于变量DYTGT指示的值,维护代码中采用-rdynamic选项以指定输出文件为动态链接的方式,选项-s指定删除目标文件中的符号表,的选项-ldl则指示装配程序ld需要装载dl函数库.


  2.2.3 运行make命令


  运行make后将产生执行文件dy,运行后将产生如下类似信息:


  动态链接库应用示范


  当前日期: 2001-06-28


  当前时间: 10:06:21


  当删除my.so文件时,将出现以下信息:


  动态链接库应用示范


  my.so: cannot open shared object file: 文件或目录不存在


  3、小结


  LINUX创建与使用动态链接库并不是一件难事.


  编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,以便其它用户共享.


  使用动态链接库,源程序中要包含dlfcn.h头文件,写程序时注意dlopen等函数的正确调用,编译时要采用-rdynamic选项与-ldl选项,以产生可调用动态链接库的执行代码.

全部回答
  • 1楼网友:山河有幸埋战骨
  • 2021-05-01 04:00

不太了解哈。。。

  • 2楼网友:笑迎怀羞
  • 2021-05-01 02:21

SO是linux的动态链接库,类似于DLL,你把他放到LIB目录下

  • 3楼网友:冷風如刀
  • 2021-05-01 01:39
so是动态库,你这个是flash的动态库,扔到firefox的plugins里面,如果是自己下的火狐中国版到火狐中国版的目录找就行了,系统自带的火狐全球通用版应该是/usr/lib/firefox/,找找。 如果是chrome浏览器ln一个连接就行,如果是konqueror在选项里面去火狐的库查找,如果扔到火狐目录里了konqueror也能找到,直接用就行了。 至于seamonkey和火狐一个样,opera没用过。。。
  • 4楼网友:神鬼未生
  • 2021-05-01 01:09

在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个 执行程序间共享,节省了空间,提高了效率,具备很高的灵活性。

同样,LINUX的也具备类似的动态链接库,而且为数不少。在/lib目录下,就有许多以.so作后缀的文件,这就是LINUX系统应用的动态链接库,只不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。(在LINUX下,静态函数库是以.a作后缀的) X-WINDOW作为LINUX下的标准图形窗口界面,它本身就采用了很多的动态链接库(在/usr/X11R6/lib目录下),以方便程序间的共享, 节省占用空间。

flash只是一个插件,在windows中就是一个ocx的链接库方式(和dll略有不同),因此linux中一旦你了一个共享函数库,你还需要安装它。其实简单的方法就是拷贝 你的库文件到指定的标准的目录(例如/usr/lib),然后运行ldconfig。 如果你没有权限去做这件事情,例如你不能修改/usr/lib目录,那么 你就只好通过修改你的环境变量来实现这些函数库的使用了。首先, 你需要创建这些共享函数库;然后,设置一些必须得符号链接,特别 是从soname到真正的函数库文件的符号链接,简单的方法就是运行ldconfig:  ldconfig -n directory_with_shared_libraries  然后你就可以设置你的LD_LIBRARY_PATH这个环境变量,它是一个以逗号 分隔的路径的集合,这个可以用来指明共享函数库的搜索路径。例如 ,使用bash,就可以这样来 启动一个程序my_program:  LD_LIBRARY_PATH=.LD_LIBRARY_PATH my_program

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯