1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      Linux系統(tǒng)中靜態(tài)庫和動態(tài)庫的生成和使用

      更新時間: 2008-04-29 16:00:05來源: 粵嵌教育瀏覽量:779

        一、靜態(tài)庫的創(chuàng)建和使用:

        1、生成靜態(tài)庫 :庫名 libmylib.a

        ar rcs libmylib.a mylib.o

        2、將靜態(tài)庫copy到 /usr/lib/ 或/lib/ 目錄下

        cp libmylib.a /usr/lib/

        3、靜態(tài)庫的使用

        比如測試文件為test.c

        gcc -0 test test.c -lmylib

        -l為選項, mylib為庫名。mylib為libmylib的中間部分,Linux下約定所有庫都以前綴lib開始

        靜態(tài)庫以.a結尾,動態(tài)庫以.so結尾。再編譯程式時,無需帶上前綴和后綴。

        注意:靜態(tài)庫的命名需要以"lib"開頭,否者連接是編譯器無法找到庫

        二、動態(tài)庫的創(chuàng)建和使用:

        1、下面命令把mylib.c程序創(chuàng)建成了一個動態(tài)庫

        (1)、gcc -fPIC -o mylib.o -c mylib.c

        (2)、gcc -shared -o libttt.so mylib.o

        也可以直接使用一條命令

        gcc -fPIC -shared -o libttt.so mylib.c

        2、Linux有兩種方式調用動態(tài)庫連接中的函數(shù)

        (1)、gcc -o test test.c ./libttt.so

        (2)、cp libttt.so /usr/lib/libttt.so

        gcc -o test test.c /usr/lib/libttt.so

        注意:引用動態(tài)庫時,必須含有路徑,如果只是使用libttt.so,則必須確保這個庫所在目錄包括再PATH 環(huán)境變量中

        三、系統(tǒng)函數(shù)使用動態(tài)庫:

        1、void *dlopen(const char *filename, int flag)

        用于打開指定名字的動態(tài)鏈接庫,并返回一個句柄

        flag:RTLD_LAZY, RTLD_NEW, RTLD_GLOBAL

        RTLD_LAZY:在dlopen()返回前,對于動態(tài)庫中存在的未定義的變量(如外部變extern,也可以是函數(shù))

        不執(zhí)行解析,也就是不解析這個變量的地址

        RTLD_NEW:與RTLD_LAZY 不同,在dlopen()返回前,解析處每個未定義的變量的地址,如果解析不出來,dlopen會返回NULL,錯位為"undefined symbol:xxx..."

        RTLD_GLOBAL:是庫中被解析出來的變量在隨后的其它鏈接庫中也可以使用,即全局有效。

        2、void *dlsym(void *handle, char *symbol)

        根據(jù)動態(tài)鏈接庫的句柄與函數(shù)名,返回函數(shù)名對應的函數(shù)的地址。

        3、int dlclose(void *handle)

        關閉動態(tài)鏈接庫,handle是調用dlopen函數(shù)庫的句柄

        4、const char *dlerror(void)

        動態(tài)庫鏈接庫執(zhí)行失敗時,dlerror返回錯誤信息,若執(zhí)行成功,則返回NULL

        例子:

      main.c
                  int main(void)
                  {
                  void *handle;
                  char *error;
                  void (*welcome)();
                  if ((handle = dlopen("./libttt.so", RTLD_LAZY)) == NULL)
                  {
                  printf("dlopen error\n");
                  return -1;
                  }
                  welcome = dlsym(handle, "welcome");
                  if ((error = dlerror()) != NULL)
                  {
                  printf("dlsym error\n");
                  return -1;
                  }
                  welcome();
                  dlclose(handle);
                  return 0;
                  }
                  gcc -ldl -o main main.c

        -ldl 指明dlopen函數(shù)所在的庫。

        注意:dlopen("./libttt.so", RTLD_LAZY),的目錄是在當前目錄下,如果不在當前目錄下,程序運行錯誤

        共享庫進行更新或安裝新庫后,必須運行l(wèi)dconfig命令更新/etc/ld.conf文件中相應的項

        如果使用RPM進行安裝,一般會自動進行更新,不過也不能保證這一點。

        使用數(shù)學庫時加上 -lm

        gcc -lm

        庫工具使用:

        ldd 工具

        ldd 用來顯示執(zhí)行文件需要哪些共享庫, 共享庫裝載管理器在哪里找到了需要的共享庫。


      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲成Aⅴ人片在线影院八 亚洲人人夜夜澡人人爽 | 制服丝袜欧美精选在线 | 最新国产成年人小视频 | 中文字幕亚洲日韩第一页 | 亚洲欧美中文在线观看 | 在线播放一区二区不卡三区 |