最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++靜態(tài)庫與動態(tài)庫文件的生成和使用教程

 更新時間:2023年03月07日 11:19:58   作者:隱居的遮天惡鬼  
庫文件是計算機上的一類文件,可以簡單的把庫文件看成一種代碼倉庫,它提供給使用者一些可以直接拿來用的變量、函數(shù)和類,下面這篇文章主要給大家介紹了關于C++靜態(tài)庫與動態(tài)庫文件的生成和使用的相關資料,需要的朋友可以參考下

前言

本文主要講解了靜態(tài)庫和動態(tài)庫的生成,以及.o文件和.so文件的使用。

庫文件

庫是一組預先編譯好的方法的集合,是計算機上的一類文件,提供給使用者一些開箱即用的變量、函數(shù)或類。庫文件分為靜態(tài)庫和動態(tài)庫,靜態(tài)庫和動態(tài)庫的區(qū)別體現(xiàn)在程序的鏈接階段。

一般來說,Windows的靜態(tài)庫文件擴展名是 .lib,動態(tài)庫文件擴展名是 .dll (Dynamic-Link Libraries);Linux的靜態(tài)庫擴展名是 .a,動態(tài)庫擴展名是 .so (Shared Object)。內容一樣,都是將函數(shù)封裝,編譯后生成.o文件,將所有 .o 文件合并生成庫文件,再將供自己或他人調用。好處在于編譯后的庫文件的源代碼被加密,使用者看不到,可保密。

Linux系統(tǒng)存儲的庫的位置一般在:/lib 和 /usr/lib。 在 64 位的系統(tǒng)上有些庫也可能被存儲在/usr/lib64 下。庫的頭文件一般會被存儲在 /usr/include 下或其子目錄下。

Linux庫有兩種,一種是靜態(tài)庫,其命令規(guī)則為 libxxx.a;一種是共享庫,其命令規(guī)則為 libxxx.so。

靜態(tài)庫的生成

編輯三個文件,分別是hello.h、hello.c和main.c文件,文件內容如下:

hello.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H

hello.c

#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}

main.c

#include "hello.h"
int main()
{
hello("everyone");
return 0;
}

因為無論是靜態(tài)庫文件還是動態(tài)庫文件都是通過.o文件生成的,所以我們必須先利用gcc將.c文件編譯成對應的.o文件,輸入以下命令實現(xiàn)

gcc -c hello.c

生成后的結果:

靜態(tài)庫文件名的命名規(guī)范是以 lib 為前綴,緊接著跟靜態(tài)庫名,擴展名為.a。例如:我們將創(chuàng)建的靜態(tài)庫名為mian,則靜態(tài)庫文件名就是libmain.a。創(chuàng)建靜態(tài)庫用 ar 命令。

由.o 文件創(chuàng)建靜態(tài)庫

ar -crv libhyhello.a hello.o

創(chuàng)建靜態(tài)庫成功:

使用靜態(tài)庫

使用靜態(tài)庫有3中方法,三種方法所用語句不同,但是運行結果相同。

方法一:

gcc -o hello main.c -L. -lhyhello

方法二:

gcc main.c libhyhello.a -o hello

方法三:

gcc -c main.c
gcc -o hello main.o libmyhello.a

我們刪除靜態(tài)庫文件試試公用函數(shù)hello 是否真的鏈接到目標文件hello 中了。若刪除了靜態(tài)庫仍可以執(zhí)行,則表明連接到目標文件hello中。

動態(tài)庫的生成

由.o文件生成動態(tài)庫。

生成.so文件,命令行:

gcc -shared -fPIC -o libhyhello.so hello.o

鏈接動態(tài)庫到可執(zhí)行文件:

gcc -o hello main.c libhyhello.so 

此時,你可以做個實驗,把這個動態(tài)庫先把這個動態(tài)庫給挪到一個文件夾下,然后再來運行程序:

你會發(fā)現(xiàn):動態(tài)庫文件找不到,因此根本無法運行程序。

那么程序一般情況下會在哪個路徑下找你的頭文件呢?可以通過輸入指令進行查看:

env

這里可以看出:系統(tǒng)是在usr/local/lib這個路徑下去找頭文件的。

回到剛剛那個目錄下,將文件復制到 /usr/local/lib 中,在執(zhí)行hello:

mv hh/libhyhello.so /usr/local/lib/

輸出結果如下圖所示:

正常運行。

GCC命令相同時,會先執(zhí)行.a文件,還是會先執(zhí)行.so文件?

先刪除除.c和.h文件外的所有文件,然后再編譯形成.o文件,生成.o文件后,再由.o文件分別生成.a文件和.so文件。

執(zhí)行程序后,發(fā)現(xiàn)當靜態(tài)庫和動態(tài)庫同名時,gcc 命令將優(yōu)先使用動態(tài)庫,默認去連/usr/lib 和/lib 等目錄中的動態(tài)庫。

靜態(tài)庫與動態(tài)庫的區(qū)別

每一個程序在使用靜態(tài)庫時,都會將靜態(tài)庫文件拷貝一份添加到自身。如果有多個程序都要使用該靜態(tài)庫文件時,都會給自身添加一份拷貝,這就導致會產生空間浪費。在源文件較少時不明顯,但如果在一個項目中,靜態(tài)庫文件本身就比較大,并且使用該靜態(tài)庫文件的源程序很多,這就會造成大量內存浪費。

而動態(tài)庫文件在被使用時,會對所有想使用該動態(tài)庫的源程序添加一個標記,在程序執(zhí)行時再鏈接動態(tài)庫文件使用。這就是動態(tài)庫的優(yōu)點,也是動態(tài)庫被稱為共享庫的原因。

使用

靜態(tài)庫的使用

首先編輯四個文件,分別是A1.c、A2.c、A.h和test.c文件,文件內容分別為:

A1.c

int add(int a,int b){
return a+b;
}

A2.c

int sub(int a,int b){
return a-b;
}

A.h

#ifndef A_H
#define A_H
int add(int a,int b);
int sub(int a,int b);
#endif

test.c

#include <stdlib.h>
#include "A.h"

int main(){
int a = 2,b=1;
printf("add is %d\n", add(a,b));
printf("sub is %d\n", sub(a,b));
}

將A1.c和A2.c都生成目標文件

gcc -c A1.c A2.c

生成靜態(tài)庫.a文件

ar -crv libhyhello.a A1.o A2.o

使用.a文件創(chuàng)建可執(zhí)行.exe文件

gcc -o test test.c libhyhello.a 

./test

運行結果如下圖所示:

動態(tài)庫的使用

生成目標文件

gcc -c -fpic A1.c A2.c

生成共享庫.so文件

gcc -shared *.o -o libhysofile.so

創(chuàng)建可執(zhí)行程序
提示:先要返回到根目錄下,賦值文件到 /usr/lib。

sudo cp libhysofile.so /usr/lib
gcc -o test test.c libhysofile.so
./test

運行結果如下圖所示:

動態(tài)庫的簡單應用

將sub1.o和sub2.o的目標文件生成一個.so動態(tài)庫文件:

gcc -shared -fPIC -o libtest.so A1.o A2.o

比較.o文件和.so文件的大小

ls-lht xya xyso

比較可以看出,動態(tài)庫的文件較大一些。

總結

到此這篇關于C++靜態(tài)庫與動態(tài)庫文件的生成和使用的文章就介紹到這了,更多相關C++靜態(tài)庫與動態(tài)庫文件生成內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

    基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

    本篇文章是對Sizeof與Strlen的區(qū)別以及聯(lián)系的使用進行了詳細的介紹。需要的朋友參考下
    2013-05-05
  • 基于C++實現(xiàn)五子棋小游戲

    基于C++實現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細介紹了基于C++實現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++ 關于STL中sort()對struct排序的方法

    C++ 關于STL中sort()對struct排序的方法

    本篇文章介紹了,關于STL中sort()對struct排序的方法。需要的朋友參考下
    2013-04-04
  • 基于C語言實現(xiàn)點餐系統(tǒng)

    基于C語言實現(xiàn)點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Matlab中圖像數(shù)字水印算法的原理與實現(xiàn)詳解

    Matlab中圖像數(shù)字水印算法的原理與實現(xiàn)詳解

    數(shù)字水印技術作為信息隱藏技術的一個重要分支,是將信息(水印)隱藏于數(shù)字圖像、視頻、音頻及文本文檔等數(shù)字媒體中,從而實現(xiàn)隱秘傳輸、存儲、標注、身份識別、版權保護和防篡改等目的。本文就來講講圖像數(shù)字水印算法的原理與實現(xiàn),感興趣的可以了解一下
    2023-04-04
  • Qt編程實現(xiàn)小時鐘

    Qt編程實現(xiàn)小時鐘

    這篇文章主要為大家詳細介紹了Qt編程實現(xiàn)小時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 基于Qt實現(xiàn)可拖動自定義控件

    基于Qt實現(xiàn)可拖動自定義控件

    這篇文章主要為大家詳細介紹了如何基于Qt實現(xiàn)可拖動自定義控件,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • 淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系

    淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系

    下面小編就為大家?guī)硪黄獪\談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++學習筆記之淺談異常處理

    C++學習筆記之淺談異常處理

    C++ 提供了異常機制,讓我們能夠捕獲運行時錯誤,本文就詳細的介紹了C++異常處理入門,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • c語言中static修飾函數(shù)的方法及代碼

    c語言中static修飾函數(shù)的方法及代碼

    在本篇內容里小編給大家分享的是一篇關于c語言中static如何修飾函數(shù)的知識點內容,有需要朋友們可以跟著學習下。
    2021-10-10

最新評論

定日县| 永清县| 莆田市| 普安县| 通城县| 太湖县| 揭阳市| 寻乌县| 临夏市| 大宁县| 五华县| 分宜县| 绵阳市| 洪洞县| 龙江县| 泰顺县| 安溪县| 宜春市| 雷州市| 甘谷县| 科技| 呼和浩特市| 那曲县| 安新县| 南安市| 高清| 大化| 腾冲县| 宁南县| 陆良县| 定南县| 温泉县| 遵义县| 彭泽县| 库尔勒市| 德江县| 本溪市| 阿勒泰市| 岳阳市| 莲花县| 秦安县|