【09】C++實戰篇——C++ 生成靜態庫.lib 及 C++調用lib,及實際項目中的使用技巧

文章目錄

  • 1 C++ 靜態庫.lib 生成
    • 1.1 靜態庫lib的生成方法和使用方法
    • 1.2 創建靜態庫項目
    • 1.3 編寫.h 和 .cpp文件
    • 1.4 設置 及 生成 DLL
  • 2 調用 C++ 靜態庫lib
    • 2.1 新建LIBtest及測試代碼
    • 2.2 靜態庫配置 及代碼調用測試
  • 3 實際項目中的使用技巧、及通用設置
    • 3.1 設置lib輸出路徑
    • 3.2 設置頭文件引入路徑
    • 3.3 改進后 測試
  • 4 完整代碼.h文件、.cpp 文件
  • 5 完整項目文件下載

1 C++ 靜態庫.lib 生成

C++ 靜態庫.lib 生成C++ 動態庫.dll生成方法基本一樣,【08】C++實戰篇——C++ 生成動態庫.dll 及 C++調用DLL,及實際項目中的使用技巧

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

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

  • //導出函數
  • //導出類
  • //以C方式導出函數

1.1 靜態庫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.代碼調用

1.2 創建靜態庫項目

1.VS創建C++ 空項目MyLIB
在這里插入圖片描述

1.3 編寫.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"/*創建靜態庫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;
}

1.4 設置 及 生成 DLL

右鍵項目–>屬性–>配置類型–>靜態庫( .lib)
在這里插入圖片描述

右鍵項目–>生成 (如修改后,可以點重新生成)

成功:
在這里插入圖片描述
查看 生成的lib文件
在這里插入圖片描述

2 調用 C++ 靜態庫lib

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

2.1 新建LIBtest及測試代碼

右鍵“解決方案MyLIB”,新建C++ 空項目LIBtest
在這里插入圖片描述
在這里插入圖片描述

在項目中添加main.cpp文件,及代碼
在這里插入圖片描述

#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;
}

2.2 靜態庫配置 及代碼調用測試

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

在這里插入圖片描述

項目右鍵-- > 屬性–>配置屬性–>鏈接器–>輸入->附加依項-- > 添加MyLIB.lib
在這里插入圖片描述

在這里插入圖片描述

LIBtest“設為啟動項”

方法參考下圖
在這里插入圖片描述
調用測試成功,

導出函數、導出類成員函數、以C方式導出的函數,現在這三種函數都用結果都輸出了,說明這三種dll導出函數方式都有,但我們最常用的是 以C方式導出的函 ,這中通用個,避免出錯。
在這里插入圖片描述

3 實際項目中的使用技巧、及通用設置

(lib、.h復制到 測試項目的.cpp目錄下,太麻煩),下面使用自動路徑

刪掉LIBtest目錄下上一次的操作文件 1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目錄下(LIBtest項目的.cpp同目錄下)

3.1 設置lib輸出路徑

直接將lib生成文件,的生路徑設為 “LIBtest”項目下的.cpp路徑;

為了是的路徑通用,這里使用相對路徑 ../LIBtest/

在這里插入圖片描述

并且將 MyLIB 設為啟動項,設置后需要重新生成lib。

可見新的dll文件已經 生成在LIBtest項目下面了

在這里插入圖片描述

在這里插入圖片描述

3.2 設置頭文件引入路徑

將LIBtest設為啟動項;
設置LIBtest項目的 附加包含目錄為 ../MyLIB/這樣LIBtest項目就可以訪問 mathTest.h 文件了。

在這里插入圖片描述

3.3 改進后 測試

再次測試 OK

在這里插入圖片描述

注意:既然新的dll生成路徑已經更改到 “LIBtest”項目下的.cpp路徑,那么第一次在 MyLIB\x64\Debug\路徑下生成的生成的lib最好刪掉,

不然兩個路徑同時存在lib,調用時會產生混淆,當兩個路徑下的lib代碼源文件完全一樣時,似乎并沒有影響。一旦新的lib代碼修改了,這時兩個路徑下lib內容不一致,調用運行時就會出錯。

所以下面路徑的3文件刪掉。
在這里插入圖片描述

4 完整代碼.h文件、.cpp 文件

為了統一規范,同時使用“以C語言的方式導出函數”

導出函數、導出類成員函數、以C方式導出的函數,現在這三種函數都用結果都輸出了,說明這三種dll導出函數方式都有,但我們最常用的是 以C方式導出的函 ,這種通用個,避免出錯。

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//以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);//減法MATHTEST_API int Cmultiply(int a, int b); //乘法MATHTEST_API int Cdivide(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 生成解決方案
*///以C方式導出函數int Cadd(int a, int b)//加法
{return a + b;
}
int Csubtract(int a, int b)//減法
{return a - b;
}int Cmultiply(int a, int b)//乘法
{return a * b;
}int Cdivide(int a, int b)//除法
{return a / b;
}

5 完整項目文件下載

完整項目工程文件,下載后可直接編譯運行
在這里插入圖片描述

在這里插入圖片描述

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

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

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

相關文章

飛算JavaAI:從寫不出代碼到絲滑開發,飛算JavaAI把小白從編程深淵撈進了正軌---它都讓我懷疑自己是不是多余的!

開篇介紹 對于很多初學者來說&#xff0c;編程是一項既有趣又充滿挑戰的任務。面對復雜的代碼和繁瑣的開發流程&#xff0c;常常會感到無從下手。不過&#xff0c;現在有了飛算JavaAI&#xff0c;這一切都將變得簡單起來。 它有啥實用功能呢&#xff1f; 比如&#xff1a; …

關于tresos Studio(EB)的MCAL配置之GtmCfg

Generic Time Module通用時鐘模塊GeneralGtmCfg_DevErrorDetect開發者錯誤檢測開關GtmCfg_DemErrorReporting診斷錯誤報告開關GtmCfg_VersionInfoApi獲取版本信息的接口開關GtmCfg_ConfigSetClockManagementUnitGlobal_Clock_Control_Numerator全局時鐘分頻器的分子Global_Cloc…

深入探索Weaviate:構建高效AI應用的數據庫解決方案

在當今數據驅動的世界中&#xff0c;高效地存儲、檢索和處理大規模數據成為了AI應用開發的關鍵挑戰。Weaviate作為一個開源的向量搜索引擎&#xff0c;憑借其強大的功能和靈活的架構&#xff0c;正逐漸成為開發者構建智能AI應用的首選工具。本文將深入探討Weaviate的核心概念、…

【開源】一款開源、跨平臺的.NET WPF 通用權限開發框架 (ABP) ,功能全面、界面美觀

文章目錄一、開源地址二、框架介紹三、技術路線四、適用場景五、功能模塊六、框架演示截圖一、開源地址 Gihub地址&#xff1a; https://github.com/HenJigg/wpf-abp B站學習視頻&#xff1a;https://www.bilibili.com/video/BV1nY411a7T8?spm_id_from333.788.player.switch&…

信創緩存中間件-TongRDS(Redis平替)安裝

TongRDS 是由東方通開發的國產 分布式內存數據緩存中間件&#xff0c;功能類似于 Redis&#xff0c;但它是完全自主研發的國產產品&#xff0c;是國內信創的一大重要組件。它兼容 Redis 的接口&#xff0c;能做到應用代碼無需改動即可替換使用。TongRDS是沒有直接的下載地址的。…

Git鏈接備用手冊

三板斧及其他&#xff1a;git init&#xff1a;初始化git倉庫git add . :將所在文件夾中的所有文件加入到暫存區git commit -m 自定義記錄信息 &#xff1a;將暫存區中的數據放到Git的倉庫&#xff08;本地&#xff09;中&#xff0c;并進行記錄&#xff08;自定義&#xff0…

零信任網絡概念及在網絡安全中的應用

零信任網絡概念及在網絡安全中的應用 零信任網絡&#xff08;Zero Trust Network&#xff09;是一種顛覆傳統邊界安全的架構理念&#xff0c;其核心是**“永不信任&#xff0c;始終驗證”**&#xff08;Never Trust, Always Verify&#xff09;。它假設網絡內外均存在威脅&…

GaussDB case when的用法

1 case函數的類型case具有兩種格式&#xff0c;簡單case函數和case搜索函數。這兩種方式&#xff0c;大部分情況下可以實現相同的功能。1.1 簡單case函數語法case column when <condition> then value when <condition> then value ...... else value end;示例case…

Git用法記錄

代碼中沖突標記的含義&#xff1a;<<<<<<< HEAD 標記當前分支&#xff08;或本地&#xff09;的舊代碼作為分隔線 >>>>>>> [commit哈希] 標記從其他分支合并過來的新代碼&#xff08;這里的 c472b4b... 是提交哈希&#xff09; 暫存…

解決Android Studio中創建的模擬器第二次無法啟動的問題

Android Studio中創建的模擬器&#xff0c;首次啟動時一切正常。但是關閉模擬器&#xff0c;下一次啟動時一直顯示&#xff1a;Connecting to the Emulator&#xff0c;無法啟動。無法啟動的原因通常是默認開啟了模擬器的快速啟動功能&#xff0c;首次啟動時是“冷啟動”&#…

Linux設備驅動架構相關文章

學習一個領域&#xff0c;最好是從多個角度去學習&#xff0c;總有一個角度適合你。學習Linux驅動&#xff0c;從架構的角度把握&#xff0c;比直接看代碼更容易接受。以架構為主&#xff0c;結合細節學習&#xff0c;我稱之為自上而下的學習方法&#xff0c;就一個字&#xff…

YOLOv13 漢化優化部署版本:超圖增強自適應視覺感知的目標檢測系統

目錄 &#x1f4d6; 項目概述&#x1f680; YOLOv13 核心特性&#x1f4ca; 性能對比&#x1f5bc;? 可視化效果&#x1f527; 項目優化改進?? 快速部署指南?? 運行使用&#x1f4dd; 使用示例&#x1f527; 故障排除&#x1f31f; 項目特色&#x1f517; 相關鏈接&#…

uni-app webview的message監聽不生效(uni.postmessage is not a function)

uni-app開發app web-view組件message事件不觸發背景子頁面是h5&#xff08;非uni-app版&#xff09;子頁面是h5&#xff08;uni-app版&#xff09;背景 大致背景是 在uni-app開發的客戶端app中使用web-view嵌入h5頁面&#xff0c;在h5中通過postmessage API觸發父組件web-view…

【異常案例分析】使用空指針調用函數(非虛函數)時,沒有崩潰在函數調用處,而是崩在被調用函數內部

目錄 1、問題說明 2、代碼段地址與數據段地址 3、使用空指針調用BindWindow函數&#xff08;非虛函數&#xff09;&#xff0c;沒有崩在BindWindow函數的調用處&#xff0c;而是崩在函數內部 3.1、虛函數調用的二次尋址 3.2、崩潰在被調用函數內部 4、總結 C軟件異常排查…

鎖定中科院1區TOP!融合LSTM與Attention做時間序列預測 !

Transformer雖火&#xff0c;但在數據少、要求穩的時序預測場景中&#xff0c;LSTM仍是首選。尤其加上注意力機制后&#xff0c;更是彌補了LSTM的短板&#xff0c;增強了性能&#xff0c;實現了更精確的預測。這種組合不僅應用場景廣泛&#xff0c;工業界愛&#xff0c;學術界也…

在不可更改系統上構建數據響應機制的可選策略

在現代企業信息系統架構中&#xff0c;我們常常面臨如下挑戰&#xff1a;某個業務系統屬于“不可變更系統”&#xff0c;我們既不能修改其業務邏輯&#xff0c;也不能對其核心代碼做任何侵入式改動。但與此同時&#xff0c;我們又需要對該系統中的某些關鍵業務數據變更做出響應…

Docker 實戰 -- cloudbeaver

文章目錄前言文件目錄docker-compose.yml網絡連接前言 當你迷茫的時候&#xff0c;請點擊 Docker 實戰目錄 快速查看前面的技術文章&#xff0c;相信你總能找到前行的方向 上一篇文章 Docker 實戰 – Mysql 講述了用 docker 搭建 mysql 數據庫的過程, 連接數據庫的工具很多, …

Rust × WebAssembly 項目腳手架詳解

一、模板概覽 模板生成方式核心用途典型角色wasm-pack-templatecargo generate …把 Rust 代碼 打包成 npm 庫「底層算法/組件」作者create-wasm-appnpm init wasm-app構建純 JS/TS 項目&#xff0c;消費上面生成的 npm 包Web 前端/Node 服務rust-webpack-templatenpm init ru…

RSA 解密邏輯

以下是使用類的方式封裝 RSA 解密邏輯&#xff0c;使其更易于調用和管理&#xff1a; from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 class RSADecryptor:"""RSA 解密工具類&#xff0c;封裝解密邏輯&#xff0c;方便…

Oracle 19C 在centos中安裝操作步驟和說明

1、oracle 一到五&#xff0c;是在centos下&#xff0c;搭建數據的每個具體詳細步驟。 oracle:一、環境準備-CSDN博客 oracle:二、centos下安裝oracle-CSDN博客 oracle :三、配置LISTEN-CSDN博客 oracle:四、創建數據庫-CSDN博客 oracle&#xff1a;五、配置修改-CSDN博客…