Linux下共享庫

Linux系統下,共享庫:

 

共享庫:引用庫中相應二進制代碼的入口位置,從而間接引用
在Linux中,以lib***.so.xx 爲格式

 

/etc/ld.so.conf            共享庫的搜索位置
如:
#cat /etc/ld.so.conf
/usr/kerberos/lib
/usr/X11R6/lib
/usr/lib/sane
/usr/lib/qt-3.1/lib

ldconfig                      共享庫管理工具,在更新了共享庫後運行該命令
ldd                             查看可執行文件所用的共享庫

使用共享庫示例:
如:
libhello.c  libhello.h  usrhello.c            //共享庫源文件、共享庫頭文件、應用程序

#cat libhello.c                               //查看庫源文件內容
#include <stdio.h>
 
void print_hello(void)
{
 printf("hello world,this is library!/n");
}

#cat libhello.h                               //查看庫頭文件內容
#ifndef __libhello_H__
#define __libhello_H__
 
void print_hello(void);
 
#endif /*__libhello_H__*/

#cat usrhello.c                             //查看應用程序
#include "libhello.h"
 
int main()
{
 print_hello();
 return 0;
}

//開始生成共享庫
#gcc -fPIC  -Wall -g -c libhello.c         //生成目標文件libhello.o
-fPIC        生成與位置無關代碼
-g            生成調試信息
-c             編譯成.o 文件

#gcc -g -shared -W1,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc                //生成共享庫
-shared     創建共享庫
-W1          爲將後面的“soname,libhello.so.0”傳遞給共享庫
-soname,libhello.so.0          說明soname爲libhello.so.0,其目標名爲libhello.0.0
-lc             引用C庫

#ln -sf libhello.so.0.0  libhello.so.0
前面定義庫名爲libhello.so.0,因此需要創建一個libhello.so.0到libhello.so.0.0的連接

#ln -sf libhello.so.0     libhello.so
爲了在連接用戶的程序時使用lhello,需要再進行連接

#gcc -Wall -g -c usrhello.c              生成目標文件usrhello.o
-Wall               去除所有警告

#gcc -g -o usrhello_shared usrhello.o -L ./ -lhello      //連接庫

#ldd usrhello_shared
libhello.so => not found                          //在默認搜索路徑中沒有找到此庫

#LD_LIBRARY_PATH=$(pwd)  ./usrhello_shared        //指明庫的路徑
hello,world,library!

 

使用靜態庫,可以直接編譯到執行文件中,因此文件執行不需要查找該庫的路徑
使用共享庫,運行時需要相應庫的支持

Linux系統首先會在“LD_LIBRARY_PATH”變量下查找庫文件
然後到/etc/ld.so.conf文件裏所給的路徑查找

Linux會在路徑/lib    /usr/lib下的庫文件中搜索,下面是將創建自己的庫文件添加到搜索路徑的方法:
1、創建共享庫,保存在一個文件夾下
2、如果希望在連接時不使用-L標識,就把庫文件拷貝到/lib  /usr/lib下,
把保存路徑填寫到文件/etc/ld.so.conf裏
3、執行命令#ldconfig,更新庫信息

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章