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

C++ 項(xiàng)目引入lib和dll的區(qū)別與使用實(shí)戰(zhàn)

 更新時(shí)間:2024年02月04日 10:33:06   作者:wangnaisheng  
靜態(tài)鏈接庫與動態(tài)鏈接庫都是共享代碼的方式,本文主要介紹了C++項(xiàng)目引入lib和dll的區(qū)別與使用實(shí)戰(zhàn),具有一定的參考價(jià)值,感興趣的可以了解一下

一、介紹

1.1、lib 文件(靜態(tài)庫):

編譯時(shí)使用:當(dāng)項(xiàng)目鏈接靜態(tài)庫(.lib 文件)時(shí),編譯器會將庫中的代碼直接嵌入到最終生成的可執(zhí)行文件中。

其特點(diǎn):程序體積較大:因?yàn)榘怂斜徽{(diào)用函數(shù)的完整實(shí)現(xiàn),不依賴外部動態(tài)庫就能獨(dú)立運(yùn)行。
不需要運(yùn)行時(shí)尋找:發(fā)布程序時(shí)無需攜帶額外的庫文件,用戶不需要安裝或放置任何額外的庫就可以運(yùn)行程序。
版本更新麻煩:如果靜態(tài)庫有更新,需要重新編譯鏈接整個(gè)應(yīng)用程序才能應(yīng)用新版本的庫。

1.2、dll 文件(動態(tài)鏈接庫):

運(yùn)行時(shí)加載:應(yīng)用程序在運(yùn)行時(shí)通過鏈接器的導(dǎo)入表找到對應(yīng)的.dll 文件并加載其函數(shù)地址到進(jìn)程空間中執(zhí)行。

其特點(diǎn):程序體積較?。褐话{(diào)用函數(shù)的引用信息,實(shí)際函數(shù)體在dll中,減少了內(nèi)存占用和磁盤空間。
運(yùn)行時(shí)依賴:發(fā)布程序時(shí)必須同時(shí)提供相應(yīng)的dll文件,否則用戶在沒有這些dll的情況下無法運(yùn)行程序。
動態(tài)加載與更新靈活:可以實(shí)現(xiàn)熱更新功能,只需要替換dll文件即可更新相應(yīng)模塊的功能,而無需重新編譯整個(gè)應(yīng)用程序。

二、區(qū)別及聯(lián)系

2.1、編譯和鏈接:

lib 是靜態(tài)庫,在編譯時(shí)將庫的代碼直接嵌入到可執(zhí)行文件中。這意味著當(dāng)你使用靜態(tài)庫時(shí),你的可執(zhí)行文件會包含庫的所有代碼,因此在運(yùn)行時(shí)不需要額外的庫文件。
dll 是動態(tài)鏈接庫,它是一個(gè)獨(dú)立的文件,在運(yùn)行時(shí)被動態(tài)地加載到進(jìn)程中。使用動態(tài)鏈接庫時(shí),你的可執(zhí)行文件只包含對庫的引用,在運(yùn)行時(shí)系統(tǒng)會根據(jù)需要加載并鏈接庫。

2.2、可維護(hù)性和更新:

使用靜態(tài)庫,如果庫有更新,你需要重新編譯和鏈接你的項(xiàng)目。
使用動態(tài)鏈接庫,如果庫有更新,你只需要替換.dll 文件,而不需要重新編譯你的項(xiàng)目。

2.3、內(nèi)存占用和性能:

靜態(tài)庫會將庫的代碼全部包含在可執(zhí)行文件中,因此會增加可執(zhí)行文件的大小。
使用動態(tài)鏈接庫,只有在程序?qū)嶋H使用庫中的函數(shù)時(shí),才會將相關(guān)代碼加載到內(nèi)存中。這可以減少程序的內(nèi)存占用。

2.4、跨平臺考慮:

靜態(tài)鏈接庫通常是平臺特定的,因?yàn)樗鼈冎苯忧度氲娇蓤?zhí)行文件中。
動態(tài)鏈接庫可能是跨平臺的,因?yàn)樗鼈儶?dú)立于可執(zhí)行文件運(yùn)行,但仍然需要考慮不同平臺之間的差異和兼容性問題。

2.5、需要注意的事項(xiàng):

路徑問題:確保動態(tài)鏈接時(shí),運(yùn)行環(huán)境能找到必要的dll文件。這可能需要將dll放在系統(tǒng)的PATH環(huán)境變量包含的目錄下,或者與exe文件位于同一目錄下。
版本兼容性:不同版本的dll可能會有不同的API接口或行為,因此要保證程序使用的dll版本與開發(fā)時(shí)鏈接的lib或dll頭文件相匹配,避免因版本不一致導(dǎo)致的運(yùn)行錯(cuò)誤。
部署與維護(hù):動態(tài)鏈接庫通常要求在分發(fā)軟件時(shí)一并提供所有依賴的dll,而且需注意的是,某些dll可能還會有它們自己的依賴鏈,需要一同處理。
安全性和穩(wěn)定性:靜態(tài)鏈接可以減少由于缺少dll或dll版本不正確帶來的運(yùn)行時(shí)故障風(fēng)險(xiǎn),但可能導(dǎo)致程序包更大;動態(tài)鏈接則更利于資源管理和更新,但若管理不當(dāng),則會增加部署和運(yùn)行時(shí)出錯(cuò)的可能性。

總的來說,選擇使用 lib 還是 dll 取決于項(xiàng)目需求、可維護(hù)性要求以及性能考慮。

三、實(shí)戰(zhàn)

簡單的接口:

max.h:

#ifndef MAX_H_
#define MAX_H_
#ifdef _cplusplus
extern "C"
{
#endif
    int max(int a, int b);
#ifdef cplusplus
}
/* code */
#endif //_cplusplus

#endif //MAX_H_

max.cpp

#include "max.h"
#include <iostream>

int max(int a, int b)
{
    return a > b ? a : b;
}

然后在此處寫CMakeLists.txt

SET(LIBMAX_SRC max.cpp)
ADD_LIBRARY(max SHARED ${LIBMAX_SRC})

然后cmake .

make就能得到.so

然后編寫main.cpp 也就是調(diào)用接口的。

#include <iostream>
#include "max.h"
int main(int argc, char const *argv[])
{
    std::cout<<"max: "<<max(2,3)<<std::endl;
    return 0;
}

然后再編寫一個(gè)CMAKE

# 設(shè)置cmake的最小版本
cmake_minimum_required(VERSION 2.8.8)
# 項(xiàng)目名稱
project(main)
# 設(shè)置C++編譯器,設(shè)置變量路徑
set(CMAKE_CXX_STANDARD 11)
# 項(xiàng)目中的include路徑
include_directories(lib)
# 項(xiàng)目中的lib路徑
link_directories(lib)
add_executable(main main.cpp)
#鏈接libmax.so
target_link_libraries(main max)

然后編譯:

cmake ..

make

就能得到結(jié)果

到此這篇關(guān)于C++ 項(xiàng)目引入lib和dll的區(qū)別與使用實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)C++ lib和dll內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Windows 環(huán)境下使用 Qt 連接 MySQL

    Windows 環(huán)境下使用 Qt 連接 MySQL

    這篇文章主要介紹了Windows 環(huán)境下使用 Qt 連接 MySQL的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C語言*與&在操作線性表的作用詳解

    C語言*與&在操作線性表的作用詳解

    本文主要介紹了C語言*與&在操作線性表的作用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++之值傳遞&指針傳遞&引用傳遞的示例詳解

    C++之值傳遞&指針傳遞&引用傳遞的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C++中值傳遞、指針傳遞和引用傳遞的定義與使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-10-10
  • 與ASCII碼相關(guān)的C語言字符串操作函數(shù)

    與ASCII碼相關(guān)的C語言字符串操作函數(shù)

    這篇文章主要介紹了與ASCII碼相關(guān)的C語言字符串操作函數(shù),分別是將字符轉(zhuǎn)換為ASCII碼的toascii()函數(shù)和根據(jù)ASCII碼進(jìn)行字符串比較的strcoll()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C++中volatile關(guān)鍵字及常見的誤解總結(jié)

    C++中volatile關(guān)鍵字及常見的誤解總結(jié)

    這篇文章主要給大家介紹了關(guān)于C++中volatile關(guān)鍵字及常見的誤解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C++使用string的大數(shù)除法運(yùn)算(4)

    C++使用string的大數(shù)除法運(yùn)算(4)

    這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)除法運(yùn)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 基于C++制作一個(gè)簡單的跑酷游戲

    基于C++制作一個(gè)簡單的跑酷游戲

    這篇文章主要為大家詳細(xì)介紹了如何利用C++制作一個(gè)簡單的跑酷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-06-06
  • C語言中聯(lián)合體union的實(shí)例詳解

    C語言中聯(lián)合體union的實(shí)例詳解

    這篇文章主要介紹了 C語言中聯(lián)合體union的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言數(shù)組超詳細(xì)講解中篇三子棋

    C語言數(shù)組超詳細(xì)講解中篇三子棋

    數(shù)組是一組有序的數(shù)據(jù)的集合,本篇將帶你結(jié)合數(shù)組來實(shí)現(xiàn)三子棋小游戲,上手實(shí)練更快的能夠掌握數(shù)組使用,感興趣的朋友來看看吧
    2022-04-04
  • stl容器set,map,vector之erase用法與返回值詳細(xì)解析

    stl容器set,map,vector之erase用法與返回值詳細(xì)解析

    在使用 list、set 或 map遍歷刪除某些元素時(shí)可以這樣使用,如下所示
    2013-09-09

最新評論

淅川县| 商洛市| 中卫市| 乌苏市| 封开县| 石狮市| 台北市| 利津县| 乐至县| 三穗县| 鲁山县| 饶平县| 长乐市| 武川县| 钦州市| 武胜县| 定西市| 岗巴县| 富源县| 襄垣县| 堆龙德庆县| 清苑县| 崇礼县| 梓潼县| 留坝县| 桓仁| 自贡市| 大冶市| 丹江口市| 磐石市| 大厂| 桃园市| 肇东市| 河东区| 五大连池市| 尼勒克县| 昭平县| SHOW| 太白县| 顺平县| 含山县|