C++ 生成動態庫.dll 及 C++調用DLL,C++ 生成靜態庫.lib及 C++調用lib

文章目錄

  • 1 C++ 動態庫.dll生成 及 調用
    • 1.1 生成C++ 動態庫dll
      • 1.1.1 創建項目MyDLL
      • 1.1.2 編寫.h 和 .cpp文件
      • 1.1.3 設置 及 生成 DLL
    • 1.2 調用 C++ 動態庫dll
      • 1.2.1 創建C++ 空項目DLLtest
      • 1.2.2 動態庫配置 及代碼調用測試
  • 2 C++ 靜態庫.lib 生成 及 調用
  • 3 C++ 生成靜態庫.lib及調用 (純圖教程)
    • 3.1 C++ 生成lib
    • 3.2 C++ 調用 lib
  • 4 C++ 動態庫.dll生成 及 調用 (純圖教程)
    • 4.1 C++生成DLL
    • 4.2 C++調用DLL

1 C++ 動態庫.dll生成 及 調用

1.1 生成C++ 動態庫dll

為了驗證效果,使用三種方法導出函數:

  • //導出函數
  • //導出類
  • //以C方式導出函數
創建動態庫d11:1.VS創建C++ 空項目MyDLL:編寫.h和.cpp文件在.h文件中宏定義導出圖數2.生成dll文件:右鍵項目-->屬性-->配置類型-->動態庫( .dll)以Debug x64 生成解決方案

1.1.1 創建項目MyDLL

1.VS創建C++ 空項目MyDLL:

(也可以創建動態鏈接庫,但不影響,都可以使用)
在這里插入圖片描述
在這里插入圖片描述

1.1.2 編寫.h 和 .cpp文件

添加 mathTest.hmathTest.cpp文件
在這里插入圖片描述
mathTest.h 文件

#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定義導出:
#ifndef MATHTEST_ //如果沒有定義 MATHTEST_,就定義MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //導出
#else
#define MATHTEST_API __declspec(dllimport) //導入
#endif//導出函數
MATHTEST_API int add(int a, int b);//加法
MATHTEST_API int subtract(int a, int b);//減法//導出類
class MATHTEST_API mathTest
{public:int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式導出函數
//extern "C",告訴編譯器這里是C語言代碼//為了使自己建的庫可以在 C/C++ 通用調用,使用 __cplusplus ,
//當C++調用代碼時,__cplusplus 值為1,聲明函數外面就加了一層“extern "C" {}”;
//當C 調用代碼時,__cplusplus 值為0,就相當于沒有“extern "C" {}”;#ifdef __cplusplus 
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//減法
#ifdef __cplusplus
}
#endif#endif

mathTest.cpp文件

#include "mathTest.h"/*創建動態庫d11:1.VS創建C++ 空項目MyDLL:編寫.h和.cpp文件在.h文件中宏定義導出圖數2.生成dll文件:右鍵項目-->屬性-->配置類型-->動態庫( .dll)以Debug x64 生成解決方案
*///導出函數
int add(int a, int b)//加法
{return a + b;
}
int subtract(int a, int b)//減法
{return a - b;
}//導出類
int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}//以C方式導出函數
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//減法
{return a - b;
}

1.1.3 設置 及 生成 DLL

右鍵項目–>屬性–>配置類型–>動態庫( .dll)
在這里插入圖片描述
右鍵項目–>生成 (如修改后,可以點重新生成)
在這里插入圖片描述

在這里插入圖片描述
查看 生成的DLL文件
在這里插入圖片描述
查看DLL
在這里插入圖片描述
注意是.D:\Projects\C#\MyDLL\x64\Debug,在工程同級目錄下\x64\Debug下面

而不是 D:\Projects\C#\MyDLL\MyDLL\x64\Debug,而不是在.h同級目錄的\x64\Debug下面(剛開始就在這里找,發現MyDLL.dll.recipe多了一個.recipe,迷糊了半天

在這里插入圖片描述

1.2 調用 C++ 動態庫dll

方法:

創建C++ 空項目DLLtest使用動態庫d11:隱式調用:1..lib(MyDLL.lib).dll(MyDLL.d11).h(mathTest.h)文件放到工程目錄下(DLLtest項目的.cpp同目錄下)2.項目右鍵-- > 屬性-->配置屬性-->鏈接器-->輸入->附加依項-- > 添加MyDLL.lib3.#include mathTest.h4.代碼調用

1.2.1 創建C++ 空項目DLLtest

創建C++ 空項目DLLtest

(也可以創建在MyDLL解決方案同一目錄下)
在這里插入圖片描述
在這里插入圖片描述

1.2.2 動態庫配置 及代碼調用測試

使用動態庫d11:
隱式調用:

使用動態庫d11:隱式調用:1..lib(MyDLL.lib).dll(MyDLL.dll).h(mathTest.h)文件放到工程目錄下(DLLtest項目的.cpp同目錄下)2.項目右鍵-- > 屬性-->配置屬性-->鏈接器-->輸入->附加依項-- > 添加MyDLL.lib3.#include mathTest.h4.代碼調用

完整代碼

#include<iostream>
#include"mathTest.h"
using namespace std;/*
VS創建C++ 空項目DLLtest使用動態庫d11:隱式調用:1.把.lib(MyDLL.lib)、.d11(MyDLL.d11)、.h(mathTest.h)文件放到工程目錄下(DLLtest項目的.cpp同目錄下)2.項目右鍵-- > 屬性-->配置屬性-->鏈接器-->輸入->附加依項-- > 添加MyDLL.1b3.#include mathTest.h4.代碼調用
*/int main()
{//調用dll導出的函數int sum = add(10, 5);int sub = subtract(10, 5);//調用dll導出的類成員函數mathTest mathT; //實例化對象int mul = mathT.multiply(10, 5);int div = mathT.divide(10, 5);//調用以C方式導出的函數int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);cout << "我的動態庫dll調用: "<< endl;cout << "add(10,5) = " << sum << endl<< "subtract(10,5) = " << sub << endl<< "multiply(10,5) = " << mul << endl<< "divide(10,5) = " << div << endl<< "Cadd(10,5) = " << Csum << endl<< "Csubtract(10,5) = " << Csub << endl;return 0;
}

運行測試
在這里插入圖片描述

2 C++ 靜態庫.lib 生成 及 調用

C++ 靜態庫.lib 生成C++ 動態庫.dll生成方法基本一樣

不同的就是 配置類型-->動態庫( .dll) 改為 配置類型-->靜態庫(.lib)

  • 創建靜態庫lib
創建靜態庫lib:1.VS創建C++ 空項目MyLIB:編寫.h和.cpp文件在.h文件中宏定義導出圖數2.生成1ib文件:右鍵項目-->屬性-->配置類型-->靜態庫(.lib)以Debug x64 生成解決方案
  • 使用靜態庫lib
VS創建C++ 空項目LIBtest使用靜態庫lib:隱式調用:1..lib(MyLIB.lib).h(mathTest.h)文件放到工程目錄下(LIBtest項目的.cpp同目錄下)2.項目右鍵-- > 屬性-->配置屬性-->鏈接器-->輸入->附加依項-- > 添加MyLIB.lib3.#include mathTest.h4.代碼調用

下面是關鍵截圖
在這里插入圖片描述在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
mathTest.h

#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定義導出:
#ifndef MATHTEST_ //如果沒有定義 MATHTEST_,就定義MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //導出
#else
#define MATHTEST_API __declspec(dllimport) //導入
#endif//導出函數
MATHTEST_API int add(int a, int b);//加法
MATHTEST_API int subtract(int a, int b);//減法//導出類
class MATHTEST_API mathTest
{public:int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式導出函數
//extern "C",告訴編譯器這里是C語言代碼//為了使自己建的庫可以在 C/C++ 通用調用,使用 __cplusplus ,
//當C++調用代碼時,__cplusplus 值為1,聲明函數外面就加了一層“extern "C" {}”;
//當C 調用代碼時,__cplusplus 值為0,就相當于沒有“extern "C" {}”;#ifdef __cplusplus 
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//減法
#ifdef __cplusplus
}
#endif#endif

mathTest.cpp

#include "mathTest.h"/*創建靜態庫lib:1.VS創建C++ 空項目MyLIB:編寫.h和.cpp文件在.h文件中宏定義導出圖數2.生成1ib文件:右鍵項目-->屬性-->配置類型-->靜態庫(.lib)以Debug x64 生成解決方案
*///導出函數
int add(int a, int b)//加法
{return a + b;
}
int subtract(int a, int b)//減法
{return a - b;
}//導出類
int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}//以C方式導出函數
//extern "C",告訴編譯器這里是C語言代碼
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//減法
{return a - b;
}

使用靜態庫lib:

#include<iostream>
#include"mathTest.h"
using namespace std;/*
VS創建C++ 空項目LIBtest使用靜態庫lib:隱式調用:1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目錄下(LIBtest項目的.cpp同目錄下)2.項目右鍵-- > 屬性-->配置屬性-->鏈接器-->輸入->附加依項-- > 添加MyLIB.lib3.#include mathTest.h4.代碼調用
*/int main()
{//調用dll導出的函數int sum = add(10, 5);int sub = subtract(10, 5);//調用dll導出的類成員函數mathTest mathT; //實例化對象int mul = mathT.multiply(10, 5);int div = mathT.divide(10, 5);//調用以C方式導出的函數int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);cout << "我的靜態庫.lib調用: " << endl;cout << "add(10,5) = " << sum << endl<< "subtract(10,5) = " << sub << endl<< "multiply(10,5) = " << mul << endl<< "divide(10,5) = " << div << endl<< "Cadd(10,5) = " << Csum << endl<< "Csubtract(10,5) = " << Csub << endl;return 0;
}

3 C++ 生成靜態庫.lib及調用 (純圖教程)

3.1 C++ 生成lib

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

3.2 C++ 調用 lib

在這里插入圖片描述

4 C++ 動態庫.dll生成 及 調用 (純圖教程)

4.1 C++生成DLL

在這里插入圖片描述

在這里插入圖片描述

4.2 C++調用DLL

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

信創應用服務器TongWeb安裝教程、前后端分離應用部署全流程

TongWeb 簡介TongWeb 是東方通&#xff08;TongTech&#xff09;開發的國產Java應用服務器&#xff08;中間件&#xff09;&#xff0c;類似于國外的 WebLogic、WebSphere 和開源的 Tomcat、Jetty&#xff0c;主要用于企業級Java應用&#xff08;如J2EE&#xff09;的部署和運行…

Rust 同步方式訪問 REST API 的完整指南

Rust 同步方式訪問 REST API 的完整指南 在 Rust 中不使用異步機制訪問 REST API 是完全可行的&#xff0c;特別適合簡單應用、腳本或不需要高并發的場景。以下是完整的同步實現方案&#xff1a; &#x1f4e6; 依賴選擇 推薦庫&#xff1a; [dependencies] reqwest { version…

32.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--財務服務--賬本與預算

在我們的孢子記賬應用中&#xff0c;賬本是用于記錄每一筆收支流水的核心模塊。通過賬本&#xff0c;我們可以清晰地追蹤資金的流入與流出&#xff0c;進行數據統計和分析&#xff0c;為后續的報表生成和決策支持提供基礎數據。預算模塊則是用于設置和管理預算的功能&#xff0…

模型預估打分對運籌跟蹤的影響

在uplift建模中&#xff0c;模型離線指標(QINI、AUUC)提升并不意味著在線A/B實驗的收益&#xff0c;因為在線運籌還需要λ\lambdaλ約束。如果模型打分不滿足單調增且roi邊際遞減&#xff0c;那么λ\lambdaλ運籌求解會非常不穩定&#xff0c;導致線上發券偏高&#xff0c;毛利…

音視頻學習(四十六):聲音的三要素

聲音是人類感知世界的重要途徑之一。在自然界中&#xff0c;聲波本質上是介質中傳播的機械振動&#xff0c;而人類對聲音的主觀感受主要通過三種屬性來認知和描述&#xff0c;即音調&#xff08;音高&#xff09;、響度&#xff08;強弱&#xff09;、音色&#xff08;音質&…

spring batch處理數據模板(Reader-Processor-Writer模式)

步驟監聽器 Component public class StepListener implements StepExecutionListener {private StepExecution stepExecution;public StepExecution getStepExecution() {return this.stepExecution;}Overridepublic void beforeStep(StepExecution stepExecution) {this.stepE…

【華為OD機試】從小桶里取球

題目描述 某部門開展Family Day開放日活動,其中有個從桶里取球的游戲,游戲規則如下: 有N個容量一樣的小桶等距排開,且每個小桶都默認裝了數不等的小球, 每個小桶裝的小球數量記錄在數組bucketBallNums中, 游戲開始時,要求所有桶的小球總數不能超過SUM, 如果小球總…

std::unordered_map 和 std::map的區別【C++】

std::unordered_map 和 std::map 是 C 標準庫中兩種不同的關聯容器&#xff0c;它們都用于存儲鍵值對&#xff0c;但在實現方式、性能特點和使用場景上存在顯著區別。以下是它們的主要區別&#xff1a; 1. 數據結構 std::map&#xff1a; 基于 紅黑樹&#xff08;一種自平衡二叉…

云原生環境里的顯示變革:Docker虛擬瀏覽器與cpolar穿透技術實戰

文章目錄前言【視頻教程】1. 關于neko2. 本地部署neko3. neko簡單使用4. 安裝內網穿透5. 配置neko公網地址6. 配置固定公網地址前言 現代遠程協作本該是無縫銜接的過程&#xff0c;卻被這些障礙不斷打斷&#xff1a;多設備屏幕同步存在延遲、跨平臺訪問需要復雜配置、公網IP申…

LVGL + ESP-Brookesia 在Windows下的編譯和運行

LVGL ESP-Brookesia 在Windows下的編譯和運行 1. 項目介紹 本項目是基于 LVGL&#xff08;輕量級多功能圖形庫&#xff09;和 ESP-Brookesia 的嵌入式模擬桌面應用開發框架&#xff0c;專為嵌入式設備構建豐富的圖形界面而設計。通過在Windows環境下模擬嵌入式設備的圖形界面…

【ip】IP地址能否直接填寫255?

IP地址數值限制? 最近有朋友后臺問我&#xff0c;IP地址里填255行不行&#xff1f;思索著有一陣子沒有分享基礎的知識&#xff0c;就在今天大致說一下&#xff0c;關于IP地址里填255行不行&#xff1f;答案當然是否定的。 IP地址由4個段組成&#xff0c;每個段的數值范圍其實限…

力扣熱題100----------141.環形鏈表

給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&#xff08;索…

【Java開發日記】我們來說說 LockSupport 的 park 和 unpark

目錄 一、LockSupport 1.1、LockSupport函數列表 1.2、基本使用 先 park 再 unpark 先 unpark 再 park 1.3、特點 與 Object 的 wait & notify 相比 二、LockSupport park & unpark原理 2.1、情況一&#xff0c;先調用park&#xff0c;再調用unpark park 操作…

AGI|從“實驗室”到“生產線”:企業級AI Agent 如何突圍

在數字化轉型的深水區&#xff0c;企業級 AI Agent 正從技術概念走向產業實踐&#xff0c;成為驅動生產力變革的核心引擎。目錄 一、風口已至&#xff1a;AI Agent 的崛起邏輯與市場剛需 二、企業級AI Agent&#xff1a;核心能力與獨特價值定位 三、AI Agent 的未來目標 一、…

AtCoder Beginner Contest 417

文章目錄A A SubstringB Search and DeleteC Distance IndicatorsD Takahashis ExpectationE A Path in A DictionaryF Random GatheringG Binary CatAtCoder Beginner Contest 417A A Substring You are given an N-character string S consisting of lowercase English lett…

C++23 Concepts:用類型約束重構泛型編程的終極方案

一、開篇:模板元編程的"類型檢查困局" 某金融量化團隊曾遇到詭異bug: template<typename T> void process(T data) {static_assert(std::is_arithmetic<T>::value, "需要數值類型");// 業務邏輯... } 當調用process("hello")時…

【RK3568 看門狗驅動開發詳解】

RK3568 看門狗驅動開發詳解一、Linux 看門狗子系統架構?二、設備樹配置?三、 看門狗驅動實現四、驗證看門狗定時器&#xff08;Watchdog Timer&#xff09;是保障嵌入式系統可靠性的關鍵硬件&#xff0c;它通過定期接收 “喂狗” 信號監控系統運行狀態&#xff0c;當系統故障…

探索 Vue 3.6 新特性:Vapor Mode 與高性能 Web 應用開發

Vue 3.6 簡介 Vue.js 是一個廣受歡迎的漸進式 JavaScript 框架&#xff0c;以其簡潔的 API、靈活的組件系統和高性能著稱。Vue 3.6 是 Vue 3 系列的一個重要版本&#xff0c;引入了多項性能優化和新特性&#xff0c;尤其是備受關注的 Vapor Mode&#xff0c;這是一個無需虛擬 D…

初識prometheus

Prometheus&#xff1a;云原生時代的監控利器 在當今快速發展的云原生和微服務架構時代&#xff0c;傳統的監控系統面臨著巨大的挑戰&#xff1a;如何高效地收集海量、動態變化的指標&#xff1f;如何實時告警并快速定位問題&#xff1f;如何實現靈活的可視化和強大的數據查詢…

從源碼角度分析導致 JVM 內存泄露的 ThreadLocal

文章目錄1. 為什么需要ThreadLocal2. ThreadLocal的實現解析1.1 實現分析1.2 具體實現1.3 ThreadLocalMap中Hash沖突的解決1.3.1 Hash沖突解決的幾種方法1.3.1.1 開放定值法1.3.1.2 鏈地址法1.3.1.3再哈希法&#xff1a;1.3.1.4 建立公共溢出區1.3.2 ThreadLocal解決Hash沖突的…