大橙子网站建设,新征程启航

为企业提供网站建设、域名注册、服务器等服务

linux加载动态库命令 linux 动态加载

查看linux当前加载库文件的命令

ldd

黄南州网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联从2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。

可执行文件名

查看可执行文件链接了哪些

系统动态链接库

nm

可执行文件名

查看可执行文件里面有哪些符号

strip

可执行文件名

去除符号表可以给可执行文件瘦身

如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令

strings

可执行文件名

Linux操作系统上面的动态共享库大致分为三类:

1、操作系吵歼春统级别的共享库和基础的系统工具库

比方说libc.so,

libz.so,

libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位改衫操作系统,还会有/lib64和/usr

/lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有升耐/usr/X11R6

/lib64目录。此外还可能有其他特定Linux版本的系统库目录。

这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。

2、应用程序级别的系统共享库

并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local

/lib下面去寻找共享库。

以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢?因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:

/usr/X11R6/lib64

/usr/X11R6/lib

/usr/local/lib

/lib64

/lib

/usr/lib64

/usr/lib

/usr/local/lib64

/usr/local/ImageMagick/lib

假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用

ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig

命令即可。

ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:

strings

/etc/ld.so.cache

|

grep

ImageMagick

输出结果为:

/usr/local/ImageMagick/lib/libWand.so.10

/usr/local/ImageMagick/lib/libWand.so

/usr/local/ImageMagick/lib/libMagick.so.10

/usr/local/ImageMagick/lib/libMagick.so

/usr/local/ImageMagick/lib/libMagick++.so.10

/usr/local/ImageMagick/lib/libMagick++.so

已经成功了!

3、应用程序独享的动态共享库

有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置

LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。

linux下sqlite如何制作成动态库库

1、下载源码,解压缩sqlite-autoconf-3300100.tar.gz

2、进入解压目录,执行:

#:./configure --host=arm CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ --prefix=/usr

其中--host=要运行程序的主机

CC/CXX为用到的交叉编译工具链

--prefix=安装目录

3、make

将在当前判茄文件目录下,自动生成可执行文件sqlite3及静态库文件sqlite3.a文件;

4、sudo make install

此命令会将可执行文件及静态库文件拷贝至安装目录中(也可手动拷贝)

5、以上步骤生成的可执行文件包含大量调试信息,文件比较大,可使用盯冲运strip命令去凯梁掉其中的调试信息;

#:arm-linux-gnueabi-strip sqlite3

6、生成动态库文件:

arm-linux-gnueabi-gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so

交叉编译sqlite3,生成动态库

标签:ref gcc host pthread strip config 安装 目录 工具链

linux一个应用多个版本动态库命令

Linux 系统,也同样面临和Window一样的问题,如何控制动态库的多个版本问题。Window之前没有处理好,为此专门有个名词来形容这个问题 “Dll hell”,其严重影响软件的升级和维护。 Dll hell 是指windows 上动态库新版本覆盖旧版本,但是却不兼容老版本。常常发生在程序升级之后,动态库更新,原有程逗雹序运行不起来;或者装新软件,但是已有的软件运行不起来。 同样Linux操作系统,也有同样的问题,那么它是怎么解决的呢?

Linux 为解决这个问题,引入了一套机制,如果遵守这个机制来做,就可以避免这个问题。 但是这只事一个约定,不是强制的。但是建议遵守这个约定,否则同样也会出现 Linux 版的Dll hell 问题。 下面来介绍一个这个机制。 这个机制是通过文件名,来控制dll (shared library) 的版本。

Linux 上的Dll ,叫shared library,其有三个名字,分别有不同的目的。

第一个是共享库本身的文件名(real name),其通常包含版本号,常常是是这样: libmath.so.1.1.1234 。 lib是Linux 上的库的约定前缀,math 是共享库名字,so 是共享库的后缀名,1.1.1234的是共享库的版本号,其主版本号+小版本号+build号。主版本号,代表当前动态库的版本,如果动态库的接口有变化,那么这个版本号就要加1;后面的两个版本号(小版本号 和 build 号)是告诉你详细的信山亏帆息,比如为一个hot-fix 而生成的一个版本,其小版本号加1,build号也应有变化。 这个文件名包含共享库的代码。

第二个是动态库的soname( Short for shared object name),其是应用程序加载dll 时候,其寻找共享库用的文件名。其格式为

lib + math+.so + ( major version number)

其只包含major version number,换句话说,也就是只要其接口没有变,应用程序都可以用,不管你其后minor build version or build version。

问题来了,程序运行时怎么通过soname 找个real name? Soname 存在哪里?如果与real name 关联起来?什么时候存的?

这就是接下来要介绍的第三个共享库的名字,link name,顾名思义,就是在编译过程,link 阶段用的文件名。 其将sonmae 和real name 关联起来。

第三个名字,共享库的连接名(link name),是专门为build 阶段连接而用的名字。这个名字就是lib + math +.so ,比如libmath.so。其是不带任何版本信息的。在共享库编译过程中,连接(link) 阶段,编译器将生成一个共享库及real name,同时将共享库空喊的soname,写在共享库文件里的文件头里面。可以用命令 readelf -d sharelibrary 去查看。

如何让linux加载当前目录的动态库?

linux 加载当前目录的动态库的方法是:设置合派冲适的环境变量LD_LIBRARY_PATH。

设置方法有以下三种:

1、临团粗时修改,log out之后就失效

在terminal中执行:export LD_LIBRARY_PATH=./

2、让当前帐号以后都优先加载当前目录的尘或歼动态库

修改~/.bash_profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH

3、让所有帐号从此都优先加载当前目录的动态库

修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH


本文题目:linux加载动态库命令 linux 动态加载
文章源于:http://dzwzjz.com/article/ddpdpsi.html
在线咨询
服务热线
服务热线:028-86922220
TOP