真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

1、相關(guān)知識(shí)

創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)烏爾禾,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575

  (1)、不管是制作靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù),都得對(duì).o文件進(jìn)行打包;

  (2)、在/lib64目錄下,靜態(tài)庫(kù)文件.a,動(dòng)態(tài)庫(kù)文件.so

2、靜態(tài)庫(kù)

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

  (2)、靜態(tài)庫(kù)由命令ar創(chuàng)建;  ar  -cr  add.a  add.o

 (3)、靜態(tài)庫(kù)的編譯有兩種方法:

  a:gcc test.c -o test -L. add.a     //每次都得在編譯時(shí)加上-L. 靜態(tài)庫(kù)文件;

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

樣例實(shí)現(xiàn)

第一步:打包成 .o文件

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第二步:創(chuàng)建.a文件

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第三步1:當(dāng)前目錄下通過(guò)-L. .a文件進(jìn)行編譯

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第四步1:運(yùn)行結(jié)果

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

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

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第四步2:運(yùn)行結(jié)果

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

以上就是靜態(tài)庫(kù)的制作了,按照規(guī)定流程走,最好都制作為libxxxxx.a

  a、先生成.o文件;

  b、打包成libxxxx.a文件;

  c、此時(shí)2種編譯途徑,當(dāng)前目錄下利用-L. libxxx.a或-lxxxx進(jìn)行編譯;

  d、只要編譯成功,放之四海皆可執(zhí)行--------->因?yàn)槔渺o態(tài)函數(shù)庫(kù)編譯的文件比較大

3、動(dòng)態(tài)庫(kù)的制作

  .so:用在版本升級(jí)上有優(yōu)勢(shì);核心參數(shù):-shared -fpic

  gcc -shared -fpic -o libshow.so show.c    :-fpic->產(chǎn)生位置無(wú)關(guān)代碼 -shared:->生成共享庫(kù)

樣例實(shí)現(xiàn)

第一步:實(shí)現(xiàn)創(chuàng)建libxxxx.so文件

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第二步:將libxxxx.so文件移動(dòng)到/lib64下

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第三步:運(yùn)行編譯

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

注意:

  (1)、動(dòng)態(tài)庫(kù)只有這一種編譯運(yùn)行的方式,必須將.so文件放到/lib64目錄下,且文件名必須為libxxx.so;

  (2)、靜態(tài)庫(kù)的libxxx.a文件不放,也可以編譯運(yùn)行成功;

4、動(dòng)態(tài)加載

  在運(yùn)行時(shí)才被加載到內(nèi)存當(dāng)中,效率相當(dāng)?shù)母撸?strong>編譯時(shí)要在最后加一個(gè)選項(xiàng):-ldl

 通過(guò)一系列的API完成;

  靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

  用C語(yǔ)言實(shí)現(xiàn):

第一步:先創(chuàng)建一個(gè)libxxx.so文件

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

第二步:寫加載的程序

test.c

#include"show.h"
#include

typedef void(*pFun)(char *);   //定義實(shí)現(xiàn)該方法的函數(shù)指針

int main(void){
    void *d1 = dlopen("libshow.so", RTLD_LAZY);  //打開(kāi)這個(gè)動(dòng)態(tài)庫(kù)文件
    if(d1 == NULL){
        perror("dlopen");
        return -1; 
    }   

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

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

    return 0;
}

第三步:直接進(jìn)行編譯運(yùn)行,在最后加上參數(shù):-ldl

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

這樣就實(shí)現(xiàn)了動(dòng)態(tài)加載.so文件的方法;

用C++實(shí)現(xiàn):

(1)、第一步:創(chuàng)建一個(gè)libxxx.so文件

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

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

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

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

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作

此時(shí)發(fā)送了段錯(cuò)誤;

分析:

  (1)、C語(yǔ)言找函數(shù)名稱沒(méi)有問(wèn)題;

  (2)、C++在動(dòng)態(tài)鏈接庫(kù)中找不到函數(shù)名字;因?yàn)镃++具有重載,其函數(shù)名稱早已經(jīng)不是我們所看到的函數(shù)名稱;

解決方案:

  (1)、通過(guò)匯編,找其對(duì)應(yīng)的函數(shù)名稱;

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

改進(jìn)的代碼如下:

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

#include
#include
using namespace std;

extern "C" void show(char *str);  //擴(kuò)展C,使其擁有C的性質(zhì)(就將這個(gè)函數(shù)當(dāng)做C語(yǔ)言解釋),函數(shù)名稱就是我們所看到的,好找函數(shù)名稱

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

extern "C" void show(char *str){
    cout<

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;
}

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作


靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作


當(dāng)前標(biāo)題:靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的制作
本文鏈接:http://weahome.cn/article/podijh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部