C++ 項(xiàng)目引入lib和dll的區(qū)別與使用實(shí)戰(zhàn)
一、介紹
1.1、lib 文件(靜態(tài)庫(kù)):
編譯時(shí)使用:當(dāng)項(xiàng)目鏈接靜態(tài)庫(kù)(.lib 文件)時(shí),編譯器會(huì)將庫(kù)中的代碼直接嵌入到最終生成的可執(zhí)行文件中。
其特點(diǎn):程序體積較大:因?yàn)榘怂斜徽{(diào)用函數(shù)的完整實(shí)現(xiàn),不依賴(lài)外部動(dòng)態(tài)庫(kù)就能獨(dú)立運(yùn)行。
不需要運(yùn)行時(shí)尋找:發(fā)布程序時(shí)無(wú)需攜帶額外的庫(kù)文件,用戶(hù)不需要安裝或放置任何額外的庫(kù)就可以運(yùn)行程序。
版本更新麻煩:如果靜態(tài)庫(kù)有更新,需要重新編譯鏈接整個(gè)應(yīng)用程序才能應(yīng)用新版本的庫(kù)。
1.2、dll 文件(動(dòng)態(tài)鏈接庫(kù)):
運(yùn)行時(shí)加載:應(yīng)用程序在運(yùn)行時(shí)通過(guò)鏈接器的導(dǎo)入表找到對(duì)應(yīng)的.dll 文件并加載其函數(shù)地址到進(jìn)程空間中執(zhí)行。
其特點(diǎn):程序體積較小:只包含所調(diào)用函數(shù)的引用信息,實(shí)際函數(shù)體在dll中,減少了內(nèi)存占用和磁盤(pán)空間。
運(yùn)行時(shí)依賴(lài):發(fā)布程序時(shí)必須同時(shí)提供相應(yīng)的dll文件,否則用戶(hù)在沒(méi)有這些dll的情況下無(wú)法運(yùn)行程序。
動(dòng)態(tài)加載與更新靈活:可以實(shí)現(xiàn)熱更新功能,只需要替換dll文件即可更新相應(yīng)模塊的功能,而無(wú)需重新編譯整個(gè)應(yīng)用程序。
二、區(qū)別及聯(lián)系
2.1、編譯和鏈接:
lib 是靜態(tài)庫(kù),在編譯時(shí)將庫(kù)的代碼直接嵌入到可執(zhí)行文件中。這意味著當(dāng)你使用靜態(tài)庫(kù)時(shí),你的可執(zhí)行文件會(huì)包含庫(kù)的所有代碼,因此在運(yùn)行時(shí)不需要額外的庫(kù)文件。
dll 是動(dòng)態(tài)鏈接庫(kù),它是一個(gè)獨(dú)立的文件,在運(yùn)行時(shí)被動(dòng)態(tài)地加載到進(jìn)程中。使用動(dòng)態(tài)鏈接庫(kù)時(shí),你的可執(zhí)行文件只包含對(duì)庫(kù)的引用,在運(yùn)行時(shí)系統(tǒng)會(huì)根據(jù)需要加載并鏈接庫(kù)。
2.2、可維護(hù)性和更新:
使用靜態(tài)庫(kù),如果庫(kù)有更新,你需要重新編譯和鏈接你的項(xiàng)目。
使用動(dòng)態(tài)鏈接庫(kù),如果庫(kù)有更新,你只需要替換.dll 文件,而不需要重新編譯你的項(xiàng)目。
2.3、內(nèi)存占用和性能:
靜態(tài)庫(kù)會(huì)將庫(kù)的代碼全部包含在可執(zhí)行文件中,因此會(huì)增加可執(zhí)行文件的大小。
使用動(dòng)態(tài)鏈接庫(kù),只有在程序?qū)嶋H使用庫(kù)中的函數(shù)時(shí),才會(huì)將相關(guān)代碼加載到內(nèi)存中。這可以減少程序的內(nèi)存占用。
2.4、跨平臺(tái)考慮:
靜態(tài)鏈接庫(kù)通常是平臺(tái)特定的,因?yàn)樗鼈冎苯忧度氲娇蓤?zhí)行文件中。
動(dòng)態(tài)鏈接庫(kù)可能是跨平臺(tái)的,因?yàn)樗鼈儶?dú)立于可執(zhí)行文件運(yùn)行,但仍然需要考慮不同平臺(tái)之間的差異和兼容性問(wèn)題。
2.5、需要注意的事項(xiàng):
路徑問(wèn)題:確保動(dòng)態(tài)鏈接時(shí),運(yùn)行環(huán)境能找到必要的dll文件。這可能需要將dll放在系統(tǒng)的PATH環(huán)境變量包含的目錄下,或者與exe文件位于同一目錄下。
版本兼容性:不同版本的dll可能會(huì)有不同的API接口或行為,因此要保證程序使用的dll版本與開(kāi)發(fā)時(shí)鏈接的lib或dll頭文件相匹配,避免因版本不一致導(dǎo)致的運(yùn)行錯(cuò)誤。
部署與維護(hù):動(dòng)態(tài)鏈接庫(kù)通常要求在分發(fā)軟件時(shí)一并提供所有依賴(lài)的dll,而且需注意的是,某些dll可能還會(huì)有它們自己的依賴(lài)鏈,需要一同處理。
安全性和穩(wěn)定性:靜態(tài)鏈接可以減少由于缺少dll或dll版本不正確帶來(lái)的運(yùn)行時(shí)故障風(fēng)險(xiǎn),但可能導(dǎo)致程序包更大;動(dòng)態(tài)鏈接則更利于資源管理和更新,但若管理不當(dāng),則會(huì)增加部署和運(yùn)行時(shí)出錯(cuò)的可能性。
總的來(lái)說(shuō),選擇使用 lib 還是 dll 取決于項(xiàng)目需求、可維護(hù)性要求以及性能考慮。
三、實(shí)戰(zhàn)
簡(jiǎ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; }
然后在此處寫(xiě)CMakeLists.txt
SET(LIBMAX_SRC max.cpp) ADD_LIBRARY(max SHARED ${LIBMAX_SRC})
然后cmake .
make就能得到.so
然后編寫(xiě)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; }
然后再編寫(xiě)一個(gè)CMAKE
# 設(shè)置cmake的最小版本 cmake_minimum_required(VERSION 2.8.8) # 項(xiàng)目名稱(chē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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用C++實(shí)現(xiàn)單向循環(huán)鏈表的解決方法
本篇文章是對(duì)用C++實(shí)現(xiàn)單向循環(huán)鏈表的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言二叉樹(shù)與堆的概念與實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言二叉樹(shù)與堆的相關(guān)資料,文章詳細(xì)記錄了他們的相關(guān)概念以及如何實(shí)現(xiàn)的,通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06C++ 中const對(duì)象與const成員函數(shù)的實(shí)例詳解
這篇文章主要介紹了C++ 中const對(duì)象與const成員函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能讓大家徹底掌握該如何使用,需要的朋友可以參考下2017-08-08C++如何調(diào)用簡(jiǎn)單的python程序
這篇文章主要介紹了C++如何調(diào)用簡(jiǎn)單的python程序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02