操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    一、靜態鏈接庫

    靜態鏈接庫的代碼在編譯時鏈接到應用程序中,因此編譯時庫必須存在,并且需要通過 “-L” 參數傳遞給編譯器,應用程序執行時不需要靜態庫的存在。

    靜態庫的生成

    靜態庫的生成分三步,設計庫原碼、編譯.o文件和使用ar命令生成庫。

    1. 設計庫原碼。

    //****pt1.c***/

    #

    int pt1(void)

    {

    ("I am .\n");

    0;

    }

    //****pt2.c***/

    #

    int pt2(void)

    {

    ("I am .\n");

    0;

    }

    2. 編譯.o

    使用 –c 選項產生目標文件,使用 –O選項優化代碼;

    # gcc –c –O pt1.c pt2.c

    3. 使用ar庫

    創建靜態庫libpt.a, 并通過 ar 的 “-r” 選項增加中間目標文件到靜態庫文件中.

    #ar –rsv libpt.a pt1.o pt2.o

    4. 靜態庫的命名規則

    為了在編譯中正確的查找到庫文件,表態庫必需以 lib[name].a 的規則命名,如libpt.a.

    靜態庫的使用

    1. 調用庫代碼

    /****main.c*******/

    int main(void)

    cmake 靜態庫鏈接_動態庫鏈接靜態庫失敗_維度鏈接庫屬于基本鏈接庫

    {

    pt1();

    pt2();

    0;

    }

    2. 編譯鏈接選項

    #gcc –O –o main main.c –L ./-lp

    或:

    #gcc –O –o main main.c ./libpt.a

    其中 –lpt的含義是 libpt.a, “-L ./” 含義是可以在當前目標下查找庫文件。

    3. 執行目標文件

    #./main

    Ar命令詳解

    Ar [] [] …..

    參數說明:

    -r 將文件插入靜態庫尾或替換靜態庫中的同名文件

    -x 從靜態庫文件中抽取庫文件

    -t 打印靜態庫中的文件列表

    -d 從靜態庫中刪除文件

    -s 重置靜態庫文件索引

    -v 創建文件的冗余信息

    -c 創建靜態文件庫

    二、動態庫

    動態庫也稱為共享庫,其代碼不會鏈接到目標文件中,只有當動態庫能正確訪問時,應用程序才能正確的執行動態鏈接庫函數。應用程序執行動態鏈接庫有兩種方式:隱式調用和顯式調用。

    1. 隱式調用

    也稱為共享庫的靜態加裁,其中動態庫函數會在應用程序執行開始時加入內存,在應用程序執行完畢后自動卸載。隱式調用的編譯方式與靜態庫一致。隱式調用的動態庫必須放在特定的目錄內才能被執行。

    2. 顯式調用

    顯式調用也稱為動態庫的動態加裁,編譯時可以不顯示的提供原動態庫文件入名稱,但必須遵循等函數的規則實現調用。應用程序可以在其運行的任意時刻加載或卸載動態鏈接庫。

    動態庫的生成

    動態庫的生成主要包括三步:設計庫原碼、編譯位置無關碼(PIC)型.o文件、鏈接動態庫。鏈接動態庫的命令包括特殊標志,與鏈接靜態庫和鏈接可執行動態文件有區別,不同的UNIX系統也不盡相同。編譯PIC型.o文件的方法一般采用C語言編譯器的 “-KPIC” 或者 “-fpic”選項,創建最終動態庫的方法一般是采用C語言編譯器的 “-G”可者 “-”選項,或者直接使用工具ld創建。

    1. 設計庫原碼。

    cmake 靜態庫鏈接_動態庫鏈接靜態庫失敗_維度鏈接庫屬于基本鏈接庫

    /*pr1.c*/

    #

    int p=1;

    void print(void)

    {

    ("this is the first dll src.\n");

    } /*pr2.c*/

    #

    int p=2;

    void print(void)

    {

    ("this is the dll src.\n");

    }

    2. 編譯位置無關碼(PIC)型.o文件和鏈接動態庫(linux和其它使用gcc編譯器的UNIX下)

    #gcc –fpic –c pr1.c pr2.c

    #gcc – –o pr1.so pr1.o

    #gcc – –o pr2.so pr2.o

    或者:

    #gcc –O –fpic – –o pr1.so pr1.c

    #gcc –O –fpic – –o pr2.so pr2.c

    某些版本gcc 也可以使用 “-G”替換”-”;

    動態鏈接庫的隱式調用

    動態鏈接庫的隱式調用分三個步驟:調用庫函數代碼、編譯鏈接、動態庫查找

    1. 調用庫函數

    /*td1.c*/

    int main(void)

    {

    print();

    0;

    }

    2. 編譯鏈接選項

    維度鏈接庫屬于基本鏈接庫_cmake 靜態庫鏈接_動態庫鏈接靜態庫失敗

    可直接將自建動態庫文件名作為參數傳遞給編譯器。

    #cp pr1.so dll.so

    #gcc –O –o td1 td1.c ./dll.so

    #./td1

    如果無法執行dll.so中的print,可將pr2.so COPY 成dll.so,再執行;

    2. 動態鏈接庫的查找

    試著將dll.so刪除,再可執行 ./td1,則提示夫法找到相應庫,

    #rm dll.so

    #./td1

    : …….

    當需要載入動態庫時,UNIX會按一定的方法查找相關的庫,上述中UNIX無法定位庫文件,所以出錯。一般情況下,當前目錄是默認查找目標,但有些UNIX系統默認目錄不是當前目錄,這樣庫文件在當前目錄下也會提示出錯。解決方法為:

    1)。帶路徑編譯

    #mkdir dll

    #cp pr1.so ./dll/dll.so

    #gcc –O –o td1 td1.c . ./dll/dll.so

    當程序執行時會自動到./dll下查找相關庫文件。

    2)。更改環境變量

    UNIX遍歷某個特定環境變量的存儲路徑,來查找動態庫,用戶可以修改環境變量以達到自動搜索動態庫的目的。

    # = ./:dll

    #

    #./td1

    注:不同的UNIX所依賴的動態庫查找路徑環境變量名稱不相同;

    3. 動態庫的更換

    #cp pr2.so ./dll/dll.so

    #./td1

    this is the dll src.

    動態鏈接庫的顯式調用

    顯式中,應用程序應該遵循函數的規則調用動態鏈接庫代碼,依次為打開動態庫、獲取動態對象地址、調用動態庫對象、錯誤檢查、關閉動態庫。

    相關函數族:

    1.UNIX中使用打開動態庫:

    cmake 靜態庫鏈接_維度鏈接庫屬于基本鏈接庫_動態庫鏈接靜態庫失敗

    #

    void *(const char *, int mode);

    加載動態庫,成功時返回指向動態庫的句柄,失敗時返回NULL,參數說明如下:

    帶路徑的動態庫名

    mode 加載方式,可取值:

    : 動態庫的對象符號在被調用時解釋

    :動態庫的對象所有符號在函數返回前被解釋;

    2. UNIX中使用dlsym取得動態庫中對象地址

    #

    void *dlsym(void *, const char * name);

    dlsym在打開的動態庫中搜索給為 name的函數對象或全變量,成功則返回相關地址,失敗返回NULL,由于返回的是 void *類型指針,需要類型轉換。參數說明如下:

    打開的動態庫句柄

    name 查找的全局變量名或函數名

    3. 錯誤檢查 UNIX中使用顯式動態庫操作中的錯誤信息

    #

    char *(void)

    本函數為返回最近的錯誤信息動態庫鏈接靜態庫失敗,函數執行后自動將錯誤信息置為NULL

    4. 關閉動態庫 動態庫使用完后動態庫鏈接靜態庫失敗,要關閉,以釋放內存

    #

    int (void * );

    參數說明:

    為打開的動態庫

    應用示例:

    以下程序動態的調用以上述創建的動態鏈接庫

    /****/

    #

    char [100];

    void main(void)

    {

    void *;

    void (*pFunc)();

    動態庫鏈接靜態庫失敗_維度鏈接庫屬于基本鏈接庫_cmake 靜態庫鏈接

    int *p;

    = ("./dll.so",);

    if (NUll == )

    {

    (,"can not find dll.so");

    goto ERR;

    }

    pFunc = (void(*)()) dlsym(,"print");

    if (NUll != pFunc)

    {

    pFunc();

    }else

    {

    (,"can not find print");

    goto ERR;

    }

    p = (int *)dlsym(,"p");

    if (p)

    {

    ("p=%d\n",p);

    }else

    {

    (,"can not find p.\n");

    goto ERR;

    }

    ();

    0;

    ///err

    ERR:

    ();

    ();

    exit(1);

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有