欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的使用示例

 更新時(shí)間:2023年09月26日 09:44:32   作者:pSomng  
在C/C++中使用庫(kù)的技術(shù),庫(kù)主要分為兩種類(lèi)型:靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),本文主要介紹了C++中靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下

單獨(dú)提這個(gè)庫(kù),我想我們?cè)赾oding過(guò)程中,可能也會(huì)知道一兩個(gè)詞,如 標(biāo)準(zhǔn)庫(kù)、xx庫(kù)等。庫(kù)作為一組已編寫(xiě)好、組織好的、可復(fù)用的資源接口,可以被用于其他程序。很不夸張地說(shuō),很多程序都需要依賴(lài)一些底層依賴(lài)庫(kù),從而支撐它們完成一些基礎(chǔ)工作。

庫(kù)主要分為兩種類(lèi)型:靜態(tài)庫(kù)(static library)動(dòng)態(tài)庫(kù)(shared library)。

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

靜態(tài)庫(kù)是一個(gè)在鏈接過(guò)程中采用靜態(tài)鏈接方式鏈接進(jìn)可執(zhí)行文件中的庫(kù)文件,在靜態(tài)鏈接方式中,可執(zhí)行文件會(huì)拷貝靜態(tài)庫(kù)中導(dǎo)出的接口并使其成為它的一部分。在Windows系統(tǒng)中它主要是以.lib為后綴,而在Linux系統(tǒng)中,主要以.a為后綴。

構(gòu)建靜態(tài)庫(kù)

項(xiàng)目結(jié)構(gòu)為:

.
├── CMakeLists.txt
├── library.h
├── library.cpp

CMakeLists.txt中的內(nèi)容為:

cmake_minimum_required(VERSION 3.26)
project(library)
set(CMAKE_CXX_STANDARD 11)
add_library(library STATIC library.cpp)

library.h的內(nèi)容為:

#ifndef HELLO_LIB_LIBRARY_H
#define HELLO_LIB_LIBRARY_H
#include <string>
class   Test {
public:
    explicit Test(std::string str);
    std::string  getStr() ;
    static int getNum() ;
private:
    std::string str_;
    static int num; // count value
};
void  print();
#endif //HELLO_LIB_LIBRARY_H

library.cpp的內(nèi)容為:

#include "library.h"
#include <iostream>
int Test::num = 0; // init
Test::Test(std::string str):str_(std::move(str)) {}
std::string Test::getStr()  {
     ++num;
    return str_;
}
 int Test::getNum(){
     return  num;
 }

采用cmake進(jìn)行構(gòu)建,即可生成對(duì)應(yīng)的靜態(tài)庫(kù)文件,在Window環(huán)境下將會(huì)生成library.lib,而在Linux環(huán)境下將會(huì)生成liblibrary.a

隨后可以在另一個(gè)項(xiàng)目中使用它,項(xiàng)目結(jié)構(gòu)為:

.
├── build
├── CMakeLists.txt
├── include
│   └── library.h
├── lib
│   └── library.lib
└── src
    └── main.cc

CmakeLists.txt的內(nèi)容為:

cmake_minimum_required(VERSION 3.10)
project(lib_test)
set(CMAKE_CXX_STANDARD 11)
include_directories(include)
# 增加鏈接庫(kù)的搜索路徑
link_directories(lib)
# 鏈接 library庫(kù)
link_libraries(library)
add_executable(${PROJECT_NAME} src/main.cc)

而隨后就可以在main.cc中使用它們了:

#include<iostream>
#include"library.h"
int main()
{
    Test test("Hello");
    std::cout << test.getStr();
    std::cout << Test::getNum();
    return 0;
}

動(dòng)態(tài)庫(kù)

動(dòng)態(tài)庫(kù)也叫做共享庫(kù),在編譯時(shí)并不會(huì)將所導(dǎo)出的接口拷貝到可執(zhí)行文件中,而是在運(yùn)行時(shí)才會(huì)被程序所引用。在Windows系統(tǒng)中它主要是以.dll為后綴,而在Linux系統(tǒng)中,主要以.so為后綴。需要特別注意的是,在MSVC編譯器中,Windows環(huán)境下不僅生成dll后綴文件,還會(huì)生成.lib文件,該文件此刻的作用是作為一個(gè)導(dǎo)入庫(kù)

構(gòu)建動(dòng)態(tài)庫(kù)

項(xiàng)目結(jié)構(gòu)大體上和上述提到的構(gòu)建的靜態(tài)庫(kù)一致,但還需要修改一下CMakeLists以及library.h(針對(duì)MSVC編譯器,Linux環(huán)境、MinGW-gcc不用管)。

library.h文件:

#ifndef HELLO_LIB_LIBRARY_H
#define HELLO_LIB_LIBRARY_H
#ifndef EXPORTTING
#define DECLSPEC __declspec(dllimport)
#else
#define DECLSPEC __declspec(dllexport)
#endif // EXPORTTING
#include <string>
class DECLSPEC  Test {
public:
    explicit Test(std::string str);
    std::string  getStr() ;
    static int getNum() ;
private:
    std::string str_;
    static int num; // count value
};
void DECLSPEC  print();
#endif //HELLO_LIB_LIBRARY_H

需要額外的添加__declspec(dllexport)指示這個(gè)類(lèi)/函數(shù)是一個(gè)可導(dǎo)出類(lèi)或函數(shù),以便在dll中導(dǎo)出它的接口同時(shí)在lib中有對(duì)應(yīng)的符號(hào)信息(只有添加了它,MSVC才會(huì)生成必需的.lib導(dǎo)入庫(kù))。同時(shí)在使用這個(gè)庫(kù)的項(xiàng)目中引用相關(guān)的頭文件也需要添加__declspec(dllimport)來(lái)導(dǎo)入所需的數(shù)據(jù)(沒(méi)有這個(gè)擴(kuò)展的話(huà),在一些場(chǎng)景時(shí)會(huì)出現(xiàn)無(wú)法解析符號(hào)的錯(cuò)誤,比如靜態(tài)數(shù)據(jù)的導(dǎo)出等),所以為了方便使用同一個(gè)頭文件,在這里采用一個(gè)宏來(lái)標(biāo)識(shí)這兩者的切換時(shí)刻。(構(gòu)建庫(kù)時(shí)導(dǎo)出(__declspec(dllexport)),使用庫(kù)時(shí)導(dǎo)入(__declspec(dllimport)))

修改CMakeLists文件:

cmake_minimum_required(VERSION 3.26)
project(library)
set(CMAKE_CXX_STANDARD 11)
# SHARED 共享庫(kù)
add_library(library SHARED library.cpp)
# 加入預(yù)定義宏 EXPORTTING
add_definitions(-DEXPORTTING )

在對(duì)應(yīng)環(huán)境下采用Cmake工具 構(gòu)建即可得到對(duì)應(yīng)環(huán)境下的動(dòng)態(tài)庫(kù)文件,比如Windows環(huán)境下會(huì)生成.lib文件和.dll文件,.lib直接和靜態(tài)庫(kù)的配置方式一樣,在CMakeLists中修改即可,而將.dll文件直接放置在可執(zhí)行文件同一路徑下,即可隱式鏈接、調(diào)用。而在Linux環(huán)境中,只會(huì)生成一個(gè).so文件,其在其他項(xiàng)目的cmake使用配置與靜態(tài)庫(kù)配置一致。

前面提到的cmake工具構(gòu)建,構(gòu)建涉及的命令可以歸納為以下步驟:

# 在項(xiàng)目根目錄下執(zhí)行
# 創(chuàng)建build目錄 并進(jìn)行構(gòu)建
cmake -Bbuild
# 執(zhí)行 make 即可完成構(gòu)建
# 方式一
cd build 
make
# 方式二 build 是構(gòu)建目錄 lib_test 是構(gòu)建目標(biāo)名
cmake --build build --target lib_test -j 8

它們的不同

  • 鏈接時(shí)刻不同:靜態(tài)庫(kù)會(huì)在編譯期完成拷貝與鏈接,而動(dòng)態(tài)庫(kù)會(huì)在運(yùn)行時(shí)按需載入。
  • 可執(zhí)行文件大小不同:靜態(tài)庫(kù)需要整體進(jìn)行拷貝成為可執(zhí)行文件的一部分,而動(dòng)態(tài)庫(kù)無(wú)需拷貝多次(拷貝一次,而后其他程序進(jìn)行共享),故對(duì)于同一個(gè)庫(kù),采用動(dòng)態(tài)鏈接會(huì)使得體積相比靜態(tài)庫(kù)更小。
  • 執(zhí)行速度不同:靜態(tài)庫(kù)在編譯期間已經(jīng)完成鏈接,而動(dòng)態(tài)庫(kù)則會(huì)有額外的動(dòng)態(tài)載入開(kāi)銷(xiāo),所以相對(duì)來(lái)說(shuō),靜態(tài)鏈接庫(kù)更快。
  • 庫(kù)更新的影響不同:靜態(tài)庫(kù)因?yàn)闀?huì)成為可執(zhí)行文件的一部分,所以其更新的時(shí)候會(huì)導(dǎo)致可執(zhí)行文件也需要重新編譯,而動(dòng)態(tài)庫(kù)只需更新版本即可(接口不變)。

到此這篇關(guān)于C++中靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的使用示例的文章就介紹到這了,更多相關(guān)C++ 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • epoll多路復(fù)用的一個(gè)實(shí)例程序(C實(shí)現(xiàn))

    epoll多路復(fù)用的一個(gè)實(shí)例程序(C實(shí)現(xiàn))

    這篇文章主要為大家詳細(xì)介紹了epoll多路復(fù)用的一個(gè)實(shí)例程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言線(xiàn)程對(duì)象和線(xiàn)程存儲(chǔ)的實(shí)現(xiàn)

    C語(yǔ)言線(xiàn)程對(duì)象和線(xiàn)程存儲(chǔ)的實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言線(xiàn)程對(duì)象和線(xiàn)程存儲(chǔ)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C/C++ 中memset() 函數(shù)詳解及其作用介紹

    C/C++ 中memset() 函數(shù)詳解及其作用介紹

    這篇文章主要介紹了C/C++ 中memset() 函數(shù)詳解及其作用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • c語(yǔ)言全盤(pán)搜索指定文件的實(shí)例代碼

    c語(yǔ)言全盤(pán)搜索指定文件的實(shí)例代碼

    c語(yǔ)言全盤(pán)搜索指定文件的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • 一文帶你認(rèn)識(shí)C語(yǔ)言的聯(lián)合體和枚舉

    一文帶你認(rèn)識(shí)C語(yǔ)言的聯(lián)合體和枚舉

    聯(lián)合體(Union)是一種特殊的數(shù)據(jù)結(jié)構(gòu),允許在同一內(nèi)存地址上存儲(chǔ)不同類(lèi)型的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言聯(lián)合體和枚舉的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 使用C語(yǔ)言實(shí)現(xiàn)從avi視頻中提取圖片

    使用C語(yǔ)言實(shí)現(xiàn)從avi視頻中提取圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)從avi視頻中提取圖片,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2023-10-10
  • C語(yǔ)言遞歸實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言遞歸實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言遞歸實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 在vscode中快速新建html文件的2種方法總結(jié)

    在vscode中快速新建html文件的2種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于在vscode中快速新建html文件的2種方法,以及如何快速打開(kāi)HTML文件查看編輯效果的方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C++函數(shù)模板學(xué)習(xí)示例教程指南

    C++函數(shù)模板學(xué)習(xí)示例教程指南

    這篇文章主要為大家介紹了C++函數(shù)模板學(xué)習(xí)示例教程指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C++實(shí)現(xiàn)連連看游戲

    C++實(shí)現(xiàn)連連看游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)連連看游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論