在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中一旦你了一个共享函数库,你还需要安装它。其实简单的方法就是拷贝 x0dx0a你的库文件到指定的标准的目录(例如/usr/lib),然后运行ldconfig。 x0dx0a如果你没有权限去做这件事情,例如你不能修改/usr/lib目录,那么 x0dx0a你就只好通过修改你的环境变量来实现这些函数库的使用了。首先, x0dx0a你需要创建这些共享函数库;然后,设置一些必须得符号链接,特别 x0dx0a是从soname到真正的函数库文件的符号链接,简单的方法就是运行ldconfig: x0dx0aldconfig -n directory_with_shared_libraries x0dx0a然后你就可以设置你的LD_LIBRARY_PATH这个环境变量,它是一个以逗号 x0dx0a分隔的路径的集合,这个可以用来指明共享函数库的搜索路径。例如 x0dx0a,使用bash,就可以这样来 x0dx0a启动一个程序my_program: x0dx0aLD_LIBRARY_PATH=.LD_LIBRARY_PATH my_program
㈡ linux上.so文件可以直接运行吗
那肯定能被执行啊,看下面图 内核中是把EXEC类型和DYN(就是DYN)都放开执行的
执行是能执行(如/lib64/libc-xx.so),但如果不特殊处理下 一般so执行都会报段错误的, 给你的so加个.interp节指定下连接器地址并指定下入口函数就可以了正常执行了哈
㈢ Linux c++开发.so文件的使用
假设在linux上用gcc编译程序,需要用下列编译选项生成.so文件:
gcc -fPIC -shared
.so 文件安装一般是在/usr/lib或者/usr/local/lib下,安装后不需要绝对路径即可使用。当然你也可以安装到工程文件夹下面,不过很少有这么做的。使用时只需要dlopen()函数打开这个库,用dlsym()函数将动态库的函数体加载进来;同样已加载的动态函数库可以用dlclose()关闭。
详细使用方法网络搜dlopen 即可。
㈣ LINUX下.so结尾的文件如何运行,或者使用
.so结尾的文件是动态链接库,动态链接库不能主动运行,只能被动调用。
.so的使用方法:
需要这个库放置到程序的搜索路径下
需要这个库提供的头文件在c/c++程序中链接调用
c/c++程序执行时会到搜索路径下动态加载.so库
㈤ libm.so.6加载失败导致无法启动linux
最简单的解决办法就是一条命令:#ldconfig,如果你有同名的libc.so.6,可以先删除之后再执行这条命令,要不然也不生效。实在不行就进救援模式,把光盘里的libc.so.6文件拷贝到系统的/lib/(或者/lib64)下。
有一点大家比较容易忽视的是,libc.so.6这个文件只是libc-2.12.so(不同的版本这个文件的名称可能不一样)的一个链接。
Linux下的共享链接库主要放在/lib目录下,以lib*.so.*为典型的文件名。Linux下的共享链接库对于Linux非常重要,几乎所有的程序都要调用共享链接库,类似于Windows下的*.dll文件。
㈥ 请教关于android linux动态库.so的加载调用
有这两种办法:
第一种:
需求:
有时候应用修复了native层一个小BUG,应用需要更新了,但是用户必须下载整个APK包进行安装,而我们需要的只是替换SO
于是想,能不能加载自定义路径下的 SO 文件呢
答案是完全没问题:
使用系统方法:
void java.lang.System.load(String pathName)
但是有一点,pathName 路径必须有执行权限,意思就是说我们不能加载SD卡上的SO,因为没有执行权限
那也没关系,我们复制到应用私有目录下就OK嘛。
看码
private void load() {
File dir = getDir("libs", Context.MODE_PRIVATE);
File soFile = new File(dir, "libTestJNI.so");
FileUtils.assetToFile(this, "libTestJNI.so", soFile);
try {
System.load(soFile.getAbsolutePath());
} catch (Exception e) {
}
}
这样就完全OK,
我们只需要架个服务器,每次启动时动态监测 SO 文件有没有更新,有则下载SO,然后加载,这样就可以避免用户安装新的应用,
要知道重新安装应用的用户体验是很差的,要让用户无感知的更新他。
第二种:
采用dlopen动态加载第三方库,无非和system.load一样,就是要实现指定路径加载so的目的,这种方法升级so的话,那就的需要一个基本so,一直不变,用来调用dlopen,然后升级另一个so。
这两种办法都会遇到一个问题,就是不能直接加载SD卡中的so,因为sd卡没有执行权限,不能直接加载这种二进制文件,需要拷贝到data/data/packagename/files/ 目录下,再次进行加载即可,拷贝也是有讲究的,需要用到context.openFileOutput方法。
㈦ linux so是什么 文件
.so文件代表Linux的共享函数库文件,程序运行时可能会使用到里面的函数代码。当一个程序需要.so共享函数库文件时,系统自动会把它加载到内存中使用。相当于Windows系统里面的dll动态链接库文件。
㈧ 请教关于android linux动态库.so的加载调用
1、 .so动态库的生成
可使用gcc或者g++编译器生成动态库文件(此处以g++编译器为例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so动态库的动态调用接口函数说明
动态库的调用关系可以在需要调用动态库的程序编译时,通过g++的-L和-l命令来指定。例如:程序test启动时需要加载目录/root/src/lib中的libtest_so1.so动态库,编译命令可照如下编写执行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(此处,我们重点讲解动态库的动态调用的方法,关于静态的通过g++编译命令调用的方式不作详细讲解,具体相关内容可上网查询)
Linux下,提供专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。
下面对这些接口函数逐一介绍(调用这些接口时,需引用头文件#include <dlfcn.h>):
1) dlopen
函数原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必须在dlerror,dlsym和dlclose之前调用,表示要将库装载到内存,准备使用。如果要装载的库依赖于其它库,必须首先装载依赖库。如果dlopen操作失败,返回NULL值;如果库已经被装载过,则dlopen会返回同样的句柄。
参数中的libname一般是库的全路径,这样dlopen会直接装载该文件;如果只是指定了库名称,在dlopen会按照下面的机制去搜寻:
a.根据环境变量LD_LIBRARY_PATH查找
b.根据/etc/ld.so.cache查找
c.查找依次在/lib和/usr/lib目录查找。
flag参数表示处理未定义函数的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暂时不去处理未定义函数,先把库装载到内存,等用到没定义的函数再说;RTLD_NOW表示马上检查是否存在未定义的函数,若存在,则dlopen以失败告终。
2) dlerror
函数原型:char *dlerror(void);
功能描述:dlerror可以获得最近一次dlopen,dlsym或dlclose操作的错误信息,返回NULL表示无错误。dlerror在返回错误信息的同时,也会清除错误信息。
3) dlsym
函数原型:void *dlsym(void *handle,const char *symbol);
功能描述:在dlopen之后,库被装载到内存。dlsym可以获得指定函数(symbol)在内存中的位置(指针)。如果找不到指定函数,则dlsym会返回NULL值。但判断函数是否存在最好的方法是使用dlerror函数,
4) dlclose
函数原型:int dlclose(void *);
功能描述:将已经装载的库句柄减一,如果句柄减至零,则该库会被卸载。如果存在析构函数,则在dlclose之后,析构函数会被调用。
3、 普通函数的调用
此处以源码实例说明。各源码文件关系如下:
test_so1.h和test_so1.cpp生成test_so1.so动态库。
test_so2.h和test_so2.cpp生成test_so2.so动态库。
test_dl.cpp生成test_dl可执行程序,test_dl通过dlopen系列等API函数,并使用函数指针以到达动态调用不同so库中test函数的目的。
㈨ 请教关于android linux动态库.so的加载调用
1.在使用第三方的.so库做android开发,发现仅仅放到AndroidProject/libs/armeabi/libminivenus.so这个位置,使用System.loadLibrary加载起来可以正常使用。
2.库的名字必须是libminivenus.so,不可以改名字。也不可以使用System.load从其他地方加载(非SD卡)。如果将库的名字或者加载位置改动,调用的jni接口就返回错误。
3.libminivenus.so中确实有libminivenus的字段,将库的名字与该字段一起修改结果无效。