编译GNULinux共享库,为什么要用PIC编译

编译GNULinux共享库,为什么要用PIC编译,第1张

不是共享库,而是动态库 (dynamic library)。 动态库的意思是库内的地址是在load时刻才由loader动态决定的,所以和静态库不同,编译出来的动态库代码必须是 “位置无关代码” (PIC: position-independant code)

LIBS += -L /usr/local/lib -levent -levent_core -levent_extra -levent_pthreads

/usr/local/lib 为lib库所在路径

-levent -levent_core -levent_extra -levent_pthreads为需要链接的库

缺少动态连接库.so--cannot open shared object file: No such file or directory

总结下来主要有3种方法:

ln -s /where/you/install/lib/*.so /usr/lib // -s选项不懂意思

sudo ldconfig //加载配置项?用来刷新共享库缓存 详细请见: ldd和ldconfig命令2013-02-06

// 我是用第一种方法完成了修改 但是不太懂 sudo ldconfig 的意思 大概是加载配置项吧

export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH

sudo ldconfig

vim /etc/ld.so.conf

add /where/you/install/lib

sudo ldconfig

动态共享库有以下的优点,使它在Linux开发中比静态链接库更加的流行。

(1) 节省内存

动态共享库无论被多少应用程序使用,在内存中都只存在一个动态共享库的副本,而不像静态链接库那样,一个应用程序在运行中用到静态链

接库,就会有多个静态链接库的副本 。

(2) 节省磁盘

这和节省内存有点相似,同样这也是由于静态链接库存在多个静态链接库的副本造成的。同样的应用程序,使用动态共享库编译出的版本通常比使用静态链接库编译出来的版本要小。因此,在嵌入式系统开发中使用动态共享库也不节省空间,提供了一种很好的选择。

(3) 便于软件修复与升级

由于动态共享是独立于应用程序存在的,因此,用新版本的动态共享库替旧版本的工作将变得非常容易。如果使用静态链接库的话,假设在一个静态库中发现了一个

ug,那么要修正这个

ug的话,就要重新编译所有使用这个静态库的应用程序,使用这个静态库的应用程序有很多的话,可以想像工作量是有多大。

(4) 提高性能

与采用静态链接库臃肿的应用程序相比,采用动态共享库的应用程序明显“苗条”得多,这样当 *** 作系统加载应用程序时,是需要把应用程序

复制到内存中的,这样的“苗条”的动态链接库也就有了很大的优势,同时提高了程序的性能。

当然,动态链接库在有上述这些优势的同时,也有以下的几个劣势。复杂性,兼容性,调试困难。但是它在Linux上使用频率上仍然比静态链接库要高的多。应用的更加广泛。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8136312.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存