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

VS中動態(tài)庫的創(chuàng)建和調(diào)用方式詳解

 更新時間:2024年01月15日 10:27:33   作者:山中毒蘑菇  
庫的存在形式本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制,? 靜態(tài)庫和動態(tài)庫的區(qū)別主要是在鏈接階段處理庫的方式不同而區(qū)分的,本文介紹VS中動態(tài)庫的創(chuàng)建和調(diào)用方式,感興趣的朋友一起看看吧

VS中動態(tài)庫的創(chuàng)建和調(diào)用

? 是寫好的現(xiàn)有的,成熟的,可以復(fù)用的代碼。庫的存在形式本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制。

? 庫有兩種:靜態(tài)庫(.a、.lib)和動態(tài)庫(.so、.dll)。所謂靜態(tài)、動態(tài)是指鏈接階段,靜態(tài)庫的鏈接階段是在項目編譯的時候靜態(tài)鏈接。動態(tài)庫是在程序運行的時候由代碼加載鏈接。

? 靜態(tài)庫和動態(tài)庫的區(qū)別主要是在鏈接階段處理庫的方式不同而區(qū)分的。

靜態(tài)庫

概念

? 靜態(tài)庫指的是在鏈接階段直接將庫和目標(biāo)文件一起打包成可執(zhí)行文件的方式所使用的庫就稱為靜態(tài)庫。

體現(xiàn)形式

? .a 或者 .lib 文件

優(yōu)缺點

? 優(yōu)點 :①使可執(zhí)行文件依賴項少,已經(jīng)被打包到可執(zhí)行文件中了。 ②編譯階段完成鏈接,執(zhí)行期間代碼裝載速度快

? 缺點:①使可執(zhí)行文件變大。②若作為其他庫的依賴庫,將會造成多余的副本,因為必須與目標(biāo)文件打包。③升級不方便,升級必須重新編譯

靜態(tài)庫的創(chuàng)建

  • 使用VS創(chuàng)建一個空項目;
  • 創(chuàng)建空項目之后將項目設(shè)置為靜態(tài)庫(點擊項目 -> 屬性 -> 常規(guī) -> 配置類型)中修改;
  • 配置項目lib輸出位置(常規(guī) -> 輸出目錄 :指的是dll輸出的文件位置);
  • 書寫接口,在靜態(tài)庫中,只要是可以允許訪問的函數(shù)和類都可以被使用,沒有特別的函數(shù)導(dǎo)入和導(dǎo)出。

例程:

#pragma once
#include <iostream>
class Arithmetic
{
public:
    // Returns a + b
    static double Add(double a, double b);//可以調(diào)用
    // Returns a - b
    static double Subtract(double a, double b);//可以調(diào)用
    // Returns a * b
    static double Multiply(double a, double b);//可以調(diào)用
    // Returns a / b
    static double Divide(double a, double b);//可以調(diào)用
    void fun2();//可以調(diào)用
private:
    static void fun();//不可以調(diào)用
    void fun1();//不可以調(diào)用
};
#include "Arithmetic.h"
double Arithmetic::Add(double a, double b)
{
    return a + b;
}
double Arithmetic::Subtract(double a, double b)
{
    return a - b;
}
double Arithmetic::Multiply(double a, double b)
{
    return a * b;
}
double Arithmetic::Divide(double a, double b)
{
    return a / b;
}
void Arithmetic::fun2() {
    std::cout << "公共  void Arithmetic::fun2()" << std::endl;
}
void Arithmetic::fun() {
    std::cout << "私有  static void Arithmetic::fun()" << std::endl;
}
void Arithmetic::fun1() {
    std::cout << "私有  void Arithmetic::fun1()" << std::endl;
}

靜態(tài)庫的調(diào)用

  • 創(chuàng)建一個項目
  • 配置項目屬性,導(dǎo)入靜態(tài)庫位置。
  • 導(dǎo)入頭文件:C/C++ -> 常規(guī) -> 附加包含目錄 :指的是需要使用的自己編寫的頭文件
  • 導(dǎo)入庫文件:鏈接器 -> 常規(guī)-> 附加庫目錄 :指的是在調(diào)用的時候聲名需要使用的lib文件。
  • 添加導(dǎo)入lib名稱:鏈接器 -> 輸入 -> 附加依賴項 :指的是在調(diào)用的時候聲名需要使用的lib文件。
  • 引入庫的頭文件,之后直接使用庫即可。

動態(tài)庫

概念

動態(tài)庫指的是在程序運行過程中動態(tài)加載庫的方式使用的庫,也就是動態(tài)庫的鏈接是發(fā)生在程序運行時期的,它和可執(zhí)行文件是分開的,只是可執(zhí)行文件在運行的某個時期調(diào)用了它。

體現(xiàn)形式

? .DLL、.lib 和 .a 、.so ;

優(yōu)缺點

? 好處:程序自身的體積不會因為動態(tài)函數(shù)庫變大。
? 缺點:就是程序運行過程中使用到了這些函數(shù)庫內(nèi)的功能時,萬一系統(tǒng)特定的位置沒有對應(yīng)的動態(tài)庫。就會造成程序崩潰或者各種奇怪的問題。

動態(tài)庫的創(chuàng)建

在介紹動態(tài)庫的創(chuàng)建之前,我們先來了解以下的宏。

#pragma once
#ifdef PUBFUN_EXPORTS
#define PUBUTIL_DLL __declspec(dllexport)
#else
#define PUBUTIL_DLL __declspec(dllimport)
#endif

MSVC編譯器提供了一系列C/C++的擴展來指定符號的導(dǎo)入導(dǎo)出,即__declspec屬性關(guān)鍵字。

dllexport與dllimport存儲級屬性是微軟對C和C++的擴展,可用于從dll中導(dǎo)入或?qū)С龊瘮?shù)、數(shù)據(jù)、對象(objects)

__declspec(dllexport) 表示該符號是從本DLL導(dǎo)出的符號。

__declspec(dllimport) 表示該符號是從別的DLL中導(dǎo)入的。

我們在創(chuàng)建動態(tài)庫的時候需要用到上面的宏。

創(chuàng)建方式1:使用空項目

  • 使用VS創(chuàng)建一個空項目;
  • 創(chuàng)建空項目之后將項目設(shè)置為動態(tài)庫(點擊項目 -> 屬性 -> 常規(guī) -> 配置類型)中修改;
  • 配置項目lib 和 DLL 輸出位置(常規(guī) -> 輸出目錄 :指的是dll輸出的文件位置);
  • 創(chuàng)建一個header.h (此文件名可以自由定義)定義之后將上面的宏寫入到文件中(宏名稱可以自己定義)。
  • 使用定義的宏定義動態(tài)庫導(dǎo)出的函數(shù)或者類。
  • 編譯生成動態(tài)庫。

編譯生成動態(tài)庫。

例程:

創(chuàng)建動態(tài)庫導(dǎo)出導(dǎo)入宏

//header.h
#pragma once
#ifdef BD_TEST
#define BDTEXT_DLL __declspec(dllimport)
#else
#define BDTEST_DLL __declspec(dllexport)
#endif

使用宏定義導(dǎo)出的函數(shù)

//testDLL.h
#pragma once
#include "header.h"
int  BDTEXT_DLL add(int a, int b);

導(dǎo)出函數(shù)功能的實現(xiàn)

//testDLL.cpp
#include "testDLL.h"
int add(int a, int b) {
	return a + b;
}

編譯:

在這里插入圖片描述

這就是最后編譯出來的lib和dll庫。

創(chuàng)建方式2:直接創(chuàng)建動態(tài)庫項目

使用直接創(chuàng)建動態(tài)庫項目,會在項目中生成一個dllMain.cpp的文件。如下:

// dllmain.cpp : 定義 DLL 應(yīng)用程序的入口點。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: 
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

根據(jù)微軟官網(wǎng)說明:

DllMain是動態(tài)鏈接庫 (DLL) 的可選入口點。 當(dāng)系統(tǒng)啟動或終止進(jìn)程或線程時,它將使用進(jìn)程的第一個線程為每個加載的 DLL 調(diào)用入口點函數(shù)。 使用 LoadLibraryFreeLibrary 函數(shù)加載或卸載 DLL 時,系統(tǒng)還會調(diào)用 DLL 的入口點函數(shù)。

之后其他的接口函數(shù)和接口類和空項目的建立是一樣的。

動態(tài)庫的調(diào)用

  • 創(chuàng)建一個項目
  • 導(dǎo)入頭文件:C/C++ -> 常規(guī) -> 附加包含目錄 :指的是需要使用的自己編寫的頭文件
  • 導(dǎo)入庫文件:鏈接器 -> 常規(guī)-> 附加庫目錄 :指的是在調(diào)用的時候聲名需要使用的lib文件。
  • 添加導(dǎo)入lib名稱:鏈接器 -> 輸入 -> 附加依賴項 :指的是在調(diào)用的時候聲名需要使用的lib文件。
  • 引入庫的頭文件,之后直接使用庫即可。
  • 將于lib配套的dll放到執(zhí)行文件exe所在的文件目錄下。

例程:

配置頭文件

在這里插入圖片描述

配置lib文件位置

在這里插入圖片描述

配置需要使用lib文件

在這里插入圖片描述

配置完成之后編寫代碼

#include <iostream>
#include <testDLL.h>//引入頭文件
int main() {
	std::cout << add(2, 5) << std::endl; //調(diào)用庫中的函數(shù)
	getchar();
	return 0;
}

注意點:

1、沒有設(shè)置為導(dǎo)出的函數(shù)名稱或者類,無法在外部調(diào)用dll使用。導(dǎo)出的函數(shù)和類必須使用導(dǎo)出宏修飾。

項目常見配置項

常規(guī) -> 輸出目錄 :指的是dll輸出的文件位置

常規(guī) -> 中間目錄 :指的是中間件的輸出位置

常規(guī) -> 配置類型 :指的是項目類型

VC++目錄 -> 包含文件 :指的是三方庫文件的頭文件位置

VC++目錄 -> 庫目錄 : 指的是三方庫文件(.dll .lib)文件

C/C++ -> 常規(guī) -> 附加包含目錄 :指的是需要使用的自己編寫的頭文件

C/C++ -> 預(yù)處理器 -> 預(yù)處理器定義 : 指的是我們需要配置的宏定義

鏈接器 -> 輸入 -> 附加依賴項 :指的是在調(diào)用的時候聲名需要使用的lib文件。

鏈接器 -> 高級 -> 導(dǎo)入庫 : 指的是lib導(dǎo)出的文件位置

到此這篇關(guān)于VS中動態(tài)庫的創(chuàng)建和調(diào)用的文章就介紹到這了,更多相關(guān)VS動態(tài)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++基于OpenCV實現(xiàn)手勢識別的源碼

    C++基于OpenCV實現(xiàn)手勢識別的源碼

    這篇文章主要介紹了C++基于OpenCV手勢識別的實現(xiàn)源碼,這里用到背景減法模型知識,具體實例代碼跟隨小編一起看看吧
    2021-09-09
  • QT樹的具體項目實現(xiàn)

    QT樹的具體項目實現(xiàn)

    本文主要介紹了QT樹的具體項目實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++實現(xiàn)一個掃雷小游戲

    C++實現(xiàn)一個掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)一個掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++?using?編譯指令與名稱沖突問題

    C++?using?編譯指令與名稱沖突問題

    using?編譯指令由名稱空間名和它前面的關(guān)鍵字?using?namespace?組成,它使名稱空間中的所有名稱都可用,而不需要使用作用域解析運算符,這篇文章主要介紹了C++?using?編譯指令與名稱沖突,需要的朋友可以參考下
    2022-11-11
  • udp socket客戶端和udp服務(wù)端程序示例分享

    udp socket客戶端和udp服務(wù)端程序示例分享

    這篇文章主要介紹了udp socket客戶端和udp服務(wù)端程序示例,需要的朋友可以參考下
    2014-03-03
  • 基于VC編寫COM連接點事件的分析介紹

    基于VC編寫COM連接點事件的分析介紹

    本篇文章是對VC編寫COM連接點事件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 解決C語言輸入單個字符屏蔽回車符的問題

    解決C語言輸入單個字符屏蔽回車符的問題

    這篇文章主要介紹了解決C語言輸入單個字符屏蔽回車符的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++ OpenCV實現(xiàn)與添加椒鹽噪聲和高斯噪音

    C++ OpenCV實現(xiàn)與添加椒鹽噪聲和高斯噪音

    圖像噪聲是圖像在獲取或是傳輸過程中受到隨機信號干擾,妨礙人們對圖像理解及分析處理的信號,本文為大家整理了C++結(jié)合OpenCV為圖像添加椒鹽噪聲和高斯噪音的代碼,需要的可以收藏一下
    2023-09-09
  • 模擬鼠標(biāo)事件的實現(xiàn)思路及代碼

    模擬鼠標(biāo)事件的實現(xiàn)思路及代碼

    這篇文章主要介紹了模擬鼠標(biāo)事件的實現(xiàn)思路及代碼,有需要的朋友可以參考一下
    2013-12-12
  • OpenSSL動態(tài)鏈接庫源碼安裝教程

    OpenSSL動態(tài)鏈接庫源碼安裝教程

    Openssl 是一個開放源代碼的SSL協(xié)議的產(chǎn)品實現(xiàn),它采用C語言作為開發(fā)語言,具備了跨系統(tǒng)的性能。這篇文章主要介紹了OpenSSL動態(tài)鏈接庫源碼安裝,需要的朋友可以參考下
    2021-11-11

最新評論

丘北县| 舟曲县| 若尔盖县| 察隅县| 黄骅市| 屯门区| 砀山县| 呼玛县| 郓城县| 且末县| 佛教| 滨州市| 科技| 屯留县| 惠东县| 成都市| 瑞安市| 江西省| 贡觉县| 瑞金市| 天峻县| 亚东县| 肇源县| 渭源县| 察雅县| 敦化市| 大兴区| 西吉县| 晋城| 岳普湖县| 博兴县| 辰溪县| 商河县| 阿拉善右旗| 临颍县| 镇远县| 扶余县| 孝昌县| 秦皇岛市| 沂水县| 安义县|