中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

靜態庫與動態庫的制作

發布時間:2020-07-16 03:22:02 來源:網絡 閱讀:629 作者:匯天下豪杰 欄目:網絡安全

1、相關知識

  (1)、不管是制作靜態庫還是動態庫,都得對.o文件進行打包;

  (2)、在/lib64目錄下,靜態庫文件.a,動態庫文件.so

2、靜態庫

  (1)、gcc -c add.c    ------> 生成add.o文件,其中通過參數(-c);

  (2)、靜態庫由命令ar創建;  ar  -cr  add.a  add.o

  (3)、靜態庫的編譯有兩種方法:

  a:gcc test.c -o test -L. add.a     //每次都得在編譯時加上-L. 靜態庫文件;

  b、將.a文件(此時的.a文件必須為lib開頭的)放到/lib64目錄下面,此時就不加-L.參數了,但是運行時要加上靜態庫文件(-lxxxx);

樣例實現

第一步:打包成 .o文件

靜態庫與動態庫的制作

第二步:創建.a文件

靜態庫與動態庫的制作

第三步1:當前目錄下通過-L. .a文件進行編譯

靜態庫與動態庫的制作

第四步1:運行結果

靜態庫與動態庫的制作

第三步2:不在當前目錄下面加-L. .a文件編譯,此時就必須的改名為libshow.a;然后移到/lib64目錄下面,在編譯時加上參數:-lshow

靜態庫與動態庫的制作

第四步2:運行結果

靜態庫與動態庫的制作

以上就是靜態庫的制作了,按照規定流程走,最好都制作為libxxxxx.a

  a、先生成.o文件;

  b、打包成libxxxx.a文件;

  c、此時2種編譯途徑,當前目錄下利用-L. libxxx.a或-lxxxx進行編譯;

  d、只要編譯成功,放之四海皆可執行--------->因為利用靜態函數庫編譯的文件比較大

3、動態庫的制作

  .so:用在版本升級上有優勢;核心參數:-shared -fpic

  gcc -shared -fpic -o libshow.so show.c    :-fpic->產生位置無關代碼 -shared:->生成共享庫

樣例實現

第一步:實現創建libxxxx.so文件

靜態庫與動態庫的制作

第二步:將libxxxx.so文件移動到/lib64下

靜態庫與動態庫的制作

第三步:運行編譯

靜態庫與動態庫的制作

注意:

  (1)、動態庫只有這一種編譯運行的方式,必須將.so文件放到/lib64目錄下,且文件名必須為libxxx.so;

  (2)、靜態庫的libxxx.a文件不放,也可以編譯運行成功;

4、動態加載

  在運行時才被加載到內存當中,效率相當的高;編譯時要在最后加一個選項:-ldl

  通過一系列的API完成;

  靜態庫與動態庫的制作

  用C語言實現:

第一步:先創建一個libxxx.so文件

靜態庫與動態庫的制作

第二步:寫加載的程序

test.c

#include"show.h"
#include<dlfcn.h>

typedef void(*pFun)(char *);   //定義實現該方法的函數指針

int main(void){
    void *d1 = dlopen("libshow.so", RTLD_LAZY);  //打開這個動態庫文件
    if(d1 == NULL){
        perror("dlopen");
        return -1; 
    }   

    pFun pfun = (pFun)dlsym(d1, "show");  //尋找名稱為show的函數

    pfun("abcd");  //找到之后,函數指針在接著調用即可
    dlclose(d1);

    return 0;
}

第三步:直接進行編譯運行,在最后加上參數:-ldl

靜態庫與動態庫的制作

這樣就實現了動態加載.so文件的方法;

用C++實現:

(1)、第一步:創建一個libxxx.so文件

靜態庫與動態庫的制作

(2)、第二步:移動到/lib64下

靜態庫與動態庫的制作

(3)、第三步:編譯運行

靜態庫與動態庫的制作

此時發送了段錯誤;

分析:

  (1)、C語言找函數名稱沒有問題;

  (2)、C++在動態鏈接庫中找不到函數名字;因為C++具有重載,其函數名稱早已經不是我們所看到的函數名稱;

解決方案:

  (1)、通過匯編,找其對應的函數名稱;

  (2)、extern "C" ,擴展C,用C的特性即可;

改進的代碼如下:

/////////////////////////////////////////////////////////////////////////////
show.h
#ifndef _SHOW_H_
#define _SHOW_H_

#include<stdio.h>
#include<iostream>
using namespace std;

extern "C" void show(char *str);  //擴展C,使其擁有C的性質(就將這個函數當做C語言解釋),函數名稱就是我們所看到的,好找函數名稱

#endif
////////////////////////////////////////////////////////////////////////////
show.cpp
#include"show.h"

extern "C" void show(char *str){
    cout<<str<<endl;
}
///////////////////////////////////////////////////////////////////////////////
test.cpp
#include"show.h"
#include<dlfcn.h>

typedef void(*pFun)(char *); 

int main(void){
    void *d1 = dlopen("libshow.so", RTLD_LAZY);
    if(d1 == NULL){
        perror("dlopen");
        return -1; 
    }   

    pFun pfun = (pFun)dlsym(d1, "show");

    pfun("abcd");
    dlclose(d1);

    return 0;
}


靜態庫與動態庫的制作


靜態庫與動態庫的制作




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长子县| 原阳县| 抚远县| 太湖县| 济源市| 和龙市| 忻州市| 晴隆县| 胶州市| 崇仁县| 宾川县| 长子县| 无极县| 金华市| 永修县| 德兴市| 灌南县| 山西省| 黄大仙区| 肃宁县| 张北县| 香港| 达拉特旗| 容城县| 府谷县| 临朐县| 图们市| 扎兰屯市| 营山县| 洪泽县| 雅江县| 铁岭县| 施秉县| 台东市| 北安市| 隆子县| 广西| 枞阳县| 乐平市| 卢氏县| 类乌齐县|