C++ 快速回顧(五)

C++ 快速回顧(五)

  • 前言
  • 一、Dll和Lib的區別
    • 區別
    • 在開發中使用
  • 二、封裝并使用C++庫
    • 1.封裝庫
    • 2.使用庫
  • 三、封裝并使用C庫
    • 1.封裝庫
    • 2.使用庫

前言

用于快速回顧之前遺漏或者補充C++知識

一、Dll和Lib的區別

靜態庫(LIB)在編譯時鏈接,代碼被復制到可執行文件中。
動態庫(DLL)在運行時鏈接,可執行文件只包含對 DLL 中函數的引用。

區別

文件分布??:
靜態庫:可執行文件獨立,不需要額外的庫文件。
動態庫:可執行文件需要依賴 DLL 文件。
??更新和維護??:
靜態庫:更新庫需要重新編譯程序。
動態庫:更新 DLL 可以獨立進行(但要保持接口兼容),程序無需重新編譯。
??內存占用??:
靜態庫:每個使用庫的程序都會在內存中有自己的一份庫代碼拷貝。
動態庫:多個程序可以共享內存中的同一份 DLL 代碼。
??加載??:
靜態庫:在程序啟動時,代碼已經被加載。
動態庫:可以在程序啟動時加載(隱式鏈接),也可以在程序運行時按需加載(顯式鏈接,使用 LoadLibrary 和 GetProcAddress 函數)。

在開發中使用

靜態庫(LIB)的使用??:
在項目配置中,需要指定靜態庫的路徑和庫文件名。鏈接時,鏈接器會將庫中的代碼直接整合到可執行文件中。
??動態庫(DLL)的使用??:
需要兩個文件:DLL 文件和導入庫(.lib)。在鏈接時,使用導入庫來解析符號,但代碼不會復制到可執行文件。運行時,DLL 文件必須放在可執行文件的目錄或系統路徑中。

如何選擇??:
如果需要減少可執行文件的大小,方便更新,或者多個程序共享庫代碼,則使用 DLL。
如果希望程序獨立運行,不依賴外部文件,則使用靜態庫。

在這里插入圖片描述

二、封裝并使用C++庫

題外話:防止頭文件被重復包含的兩種方式
1.#pragma once
2.宏定義包裹,如下:

#ifndef INTERFACE_H
#define INTERFACE_H//TODO:#endif // !INTERFACE_H

1.封裝庫

定義導出宏

#define TESTCPP_API __declspec(dllexport)

整體的頭文件如下,IInterface這個類加了導出宏就可以被導出給外界使用
在這里插入圖片描述
具體的實現如下,FHello這個類沒有加導出宏,我們只在內部使用導出后的DLL無法直接使用此類
如下代碼就是將FHello這個類作為內部實現,然后提供CreateInterface 這個接口給外界調用,返回的是內部定義的類
在這里插入圖片描述
在項目屬性中分別選擇Dll和Lib導出
在這里插入圖片描述
會生成以下這些文件
在這里插入圖片描述
我們最后實際上使用的只有如下這幾個文件,頭文件是方便我們調用函數等查看使用,具體的實現都在dll或者lib中了
在這里插入圖片描述

2.使用庫

有了上面導出的庫文件,我們可以來使用了
我們新建控制臺項目,導入之前生成的庫文件到自定義的目錄中
在這里插入圖片描述
可以看到我們可以正常包含我們實現的內容

#include "dlllib/Interface.h"
#include <iostream>int main()
{IInterface* Interface = IInterface::CreateInterface();Interface->Init();printf(Interface->GetName());Interface->Destroy();system("pause");return 0;
}

但是這時候運行卻運行不起來
我們需要根據需要設置此路徑
在這里插入圖片描述
此處有兩種方式可以選擇
第一種是直接在設置處設置即可
在這里插入圖片描述
第二種是在代碼中設置
在這里插入圖片描述
在生成前把庫拷貝到對應生成目錄之下
xcopy /e /r /y $(ProjectDir)dlllib $(OutDir)
在這里插入圖片描述
在這里插入圖片描述

三、封裝并使用C庫

1.封裝庫

使用c來封裝庫時要注意

#ifdef __cplusplus
extern "C"
{
#endif

同時注意函數要使用 ** __stdcall** 寫在要導出的函數前面,這個是函數壓棧依次進行的標識

在這里插入圖片描述
下面是具體的函數實現
在這里插入圖片描述

2.使用庫

使用的方式同上C++使用類庫
可以看到只有CTEST_API導出宏的函數可以正常進行使用,不然會在運行時報錯!!!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87067.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ARM】解決ArmDS的工程沒有生成Map文件的問題

1、 文檔目標 在嵌入式開發過程中&#xff0c;使用Arm Development Studio&#xff08;簡稱ArmDS&#xff09;進行項目構建時&#xff0c;Map文件的生成是調試和分析代碼的重要環節。Map文件不僅記錄了程序中各個段&#xff08;sections&#xff09;的內存分布情況&#xff0c…

Java如何導出word(根據模板生成),通過word轉成pdf,放壓縮包

<!-- 導出word文檔所需依賴--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0-beta</version></dependency><dependency><groupId>org.apache.poi</gr…

【C#】 DevExpress.XtraEditors.SidePanel

DevExpress.XtraEditors.SidePanel&#xff0c; 它是 DevExpress 提供的“側邊滑出”面板&#xff08;類似于抽屜、浮動信息區&#xff09;&#xff0c;非常適合做可隱藏的參數區、幫助區、臨時交互區等。 SidePanel 用法核心點 1. 基本用法 可容納其它控件&#xff0c;就像普…

1.1_2 計算機網絡的組成和功能

在這個視頻中&#xff0c;我們會探討計算機網絡的組成和功能。我們會從三個視角去探討計算機網絡由哪些部分組成&#xff0c;其次&#xff0c;我們會簡單的了解計算機網絡的功能。 首先我們可以把計算機網絡看作是由硬件、軟件和協議共同組成的一個龐大復雜的系統。首先在硬件上…

Linux驅動學習day11(定時器)

定時器 定時器主要作用就是&#xff1a;設置超時時間&#xff0c;執行超時函數。 按鍵按下存在抖動&#xff0c;為了消除抖動可以設置定時器&#xff0c;如上圖所示&#xff0c;按下一次按鍵會產生多次抖動&#xff0c;即會產生多次中斷&#xff0c;在每次中斷產生的時候&…

Java 編程之觀察者模式詳解

一、什么是觀察者模式&#xff1f; 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為型設計模式&#xff0c;用于對象之間的一對多依賴關系&#xff1a;當被觀察對象&#xff08;Subject&#xff09;狀態發生變化時&#xff0c;所有依賴它的觀察者&#xff08;O…

【C++】經典string類問題

目錄 1. 淺拷貝 2. 深拷貝 3. string類傳統寫法 4. string類現代版寫法 5. 自定義類實現swap成員函數 6. 標準庫swap函數的調用 7. 引用計數和寫時拷貝 1. 淺拷貝 若string類沒有顯示定義拷貝構造函數與賦值運算符重載&#xff0c;編譯器會自動生成默認的&#xff0c…

kotlin中object:的用法

在Kotlin中&#xff0c;object: 用于聲明匿名對象&#xff08;Anonymous Object&#xff09;&#xff0c;這是實現接口或繼承類的輕量級方式&#xff0c;無需顯式定義具名類。以下是核心用法和場景&#xff1a; 1. 基本語法 val obj object : SomeInterface { // 實現接口ov…

js代碼04

題目 非常好。我們剛剛看到了回調函數在處理多個異步操作時會變得多么混亂&#xff08;回調地獄&#xff09;。為了解決這個問題&#xff0c;現代 JavaScript 提供了一個更強大、更優雅的工具&#xff1a;Promise。 Promise&#xff0c;正如其名&#xff0c;是一個“承諾”。…

Jenkins初探-通過Docker部署Jenkins并安裝插件

簡介 本文介紹了使用Docker安裝Jenkins并進行初始配置的完整流程。主要內容包括&#xff1a; (1)通過docker pull命令獲取Jenkins鏡像&#xff1b;(2)使用docker run命令啟動容器并映射端口&#xff1b;(3)訪問Jenkins界面獲取初始管理員密碼&#xff1b;(4)安裝推薦插件并創…

嵌入式開發:GPIO、UART、SPI、I2C 驅動開發詳解與實戰案例

&#x1f4cd; 本文為嵌入式學習系列第二篇&#xff0c;基于 GitHub 開源項目&#xff1a;0voice/EmbeddedSoftwareLearn &#x1f4ac; 作者&#xff1a;0voice &#x1f440; 適合對象&#xff1a;嵌入式初學者、STM32學習者、想搞明白外設驅動開發的C語言學習者 一、驅動是什…

常用 Linux 命令和 shell 腳本語言整理

目錄 一、Linux 命令大全 1、文件和目錄操作 &#xff08;1&#xff09;ls 列出目錄內容 &#xff08;2&#xff09;pwd 查看當前目錄 &#xff08;3&#xff09;cd 切換目錄 &#xff08;4&#xff09;mkdir 創建目錄 &#xff08;5&#xff09;cp 復制文件或目錄 &…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代碼閱讀筆記-autobackend.py

autobackend.py ultralytics\nn\autobackend.py 目錄 autobackend.py 1.所需的庫和模塊 2.def check_class_names(names: Union[List, Dict]) -> Dict[int, str]: 3.def default_class_names(data: Optional[Union[str, Path]] None) -> Dict[int, str]: 4.cla…

【MySQL基礎】MySQL索引全面解析:從原理到實踐

MySQL學習&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我們基本上已經把MySQL的基礎知識都進行了學習&#xff0c;但是我們之前處理的數據都是十分少的&#xff0c;但是如果當我們的數據量很大…

第三十五章 I2S——音頻傳輸接口

第三十五章 I2S——音頻傳輸接口 目錄 第三十五章 I2S——音頻傳輸接口 1 I2S概述 1.1 簡介 1.2 功能特點 1.3 工作原理 1.4 利用DMA通信的I2S 1.4.1 I2S配合DMA通信工作原理 1.4.2 配置要點 2 應用場景 2.1 消費類音頻設備 2.2 專業音頻設備 2.3 通信設備 2.4 汽車電子 2.5 嵌…

產品-Figma(英文版),圖像的布爾類型圖例說明

文章目錄 Union SelectionSubtract SelectionIntersect SelectionExclude SelectionFlatten Selection Union Selection 把多個形狀合并成一個新的完整形狀&#xff0c;保留所有外部輪廓&#xff0c;內部不被切割。由于紅色的長方形在外面的一層&#xff0c;所以切割后&#x…

Windows CMD命令分類大全

?? ?一、系統與磁盤管理? ?系統信息? systeminfo&#xff1a;查看詳細硬件及系統配置&#xff08;版本/內存/補丁&#xff09;211 winver&#xff1a;快速檢查Windows版本11 msinfo32&#xff1a;圖形化系統信息面板811?磁盤工具? chkdsk /f&#xff1a;修復磁盤錯誤&…

【Dify系列】【Dify1.4.2 升級到Dify1.5.0】

1. 升級前準備工作 1.1 數據備份&#xff1a; 進入原安裝包 docker 目錄&#xff0c;備份“volumes”文件夾&#xff0c;此文件夾包含了 Dify 數據庫數據&#xff1a; rootjoe:/usr/local/dify/docker/volumes# pwd /usr/local/dify/docker/volumesrootjoe:/usr/local/dify/…

DeepSeek網頁版隨機點名器

用DeepSeek幫我們生成了一個基于html5的隨機點名器&#xff0c;效果非常棒&#xff0c;如果需要加入名字&#xff0c;請在代碼中按照對應的格式添加即可。 提示詞prompt 幫我生成一個隨機點名的HTML5頁面 生成真實一點的名字數據 點擊隨機按鈕開始隨機選擇 要有閃動的效果 &…

前后端分離實戰2----后端

戳我抵達前端 項目描述&#xff1a;用Vscode創建Spring Bootmybatis項目&#xff0c;用maven進行管理。創建一個User表&#xff0c;對其內容進行表的基本操作&#xff08;增刪改查&#xff09;&#xff0c;顯示在前端。 項目地址&#xff1a;戳我一鍵下載項目 運行效果如下&…