win32 靜態庫 動態庫的編寫和使用

2021-10-12 05:25:38 字數 3004 閱讀 4741

目錄

0x01 靜態庫

0x02 動態庫

庫:功能的提供,只是提供功能,並不是乙個程式

預處理:標頭檔案引入、預處理指令的執行

預編譯編譯 :語法檢查、程式優化、乙個.cpp 編譯生成乙個 .obj 檔案(機器語言)

如何使用第三方庫:

第三方庫的cpp檔案已經安裝到了我們本地,我們使用時只需要在程式中引入該第三方庫的標頭檔案,也就說只要引入該第三方庫函式的宣告。如果靜態庫,鏈結時便會將庫中目標程式和我們生成的目標程式鏈結在一起生成exe;如果是動態庫,執行時,如果需要用到動態庫中的函式,才會動態鏈結動態庫的目標程式。

靜態庫lib:

鏈結時將靜態庫的**載入到程式**中

好處:執行效率高,如果不是需求中必須用動態庫,都用靜態庫

動態庫dll:

執行時,需要用到該動態庫時,動態載入該動態庫的**。

好處:exe檔案小,可以在執行時直接更換動態庫

壞處:執行效率比較低

c的靜態庫建立:

思路:建立專案,選擇靜態庫,然後向專案中新增乙個.h標頭檔案,新增乙個.c檔案(注意不是.cpp)

將這樣兩個檔案編寫完成以後,點生成專案,就會在debug目錄下生成乙個.lib檔案,使用c的靜態庫時,需要匯入該lib檔案。

clanglib.h

#pragma once //防止標頭檔案重複引入

int clibadd(int, int);

int clibsub(int, int);

void clibshow(int, int);

如何取消預編譯標頭檔案:

專案-->屬性-->配置屬性-->c/c++-->預編譯標頭檔案-->建立/使用編譯標頭檔案-->不使用預編譯頭

clanglib.c

#include "clib.h"

#include #pragma once //防止標頭檔案重複引入

int clibadd(int a, int b)

int clibsub(int a, int b)

void clibshow(int a, int b)

c++的靜態庫建立:建立方法與c相同,只不過不要建立c檔案,建立cpp檔案即可

c中使用c的靜態庫:

首先你要找到c靜態庫lib檔案的位置,然後用#pragma comment 引入即可

// cuseclib.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include #pragma comment(lib,"..\\debug\\clanglib.lib")

int main()

c中使用c++的靜態庫(不能)

c++中使用c++的靜態庫:

不僅需要引入lib檔案,還需要引入標頭檔案 或者函式的宣告

#include "pch.h"

#include #pragma comment(lib,"..\\debug\\cpplib.lib")

void clibshow(int, int);

int main()

c++中使用c的靜態庫:

不僅需要引入lib檔案,引入標頭檔案或者函式宣告,還需要宣告lib檔案是c的靜態庫

#include #pragma comment(lib,"..\\debug\\clanglib.lib")

extern "c" void clibshow(int, int);

int main()

建立c語言動態庫

clangdll.h 注意標頭檔案需要加 _declspec(dllexport)

這樣點生成後才會既生成乙個dll ,也生成乙個lib

#pragma once //防止標頭檔案重複引入

_declspec(dllexport) int clibadd(int, int);

_declspec(dllexport) int clibsub(int, int);

_declspec(dllexport) void clibshow(int, int);

clangdll.c 的編寫同上

使用時,只需要引入.lib檔案即可

// cusecdll.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include #pragma comment (lib,"..\\debug\\clangdll.lib")

int main()

建立cpp動態庫:

其他部分同c動態庫相同,只不過

cpp檔案使用cpp動態庫時候.cpp檔案中需要宣告函式,並且加上 _declspec(dllimport)

cpp動態庫還可以提供乙個類出去,在dll專案中直接新增乙個類檔案即可(本質上還是乙個.h)

#pragma once

#include class _declspec(dllexport) classdll

;

#include "classdll.h"

void classdll::add(int a,int b)

使用動態庫中的類

#include #include "../cppdll/classdll.h"; //需要引入類的標頭檔案

#pragma comment (lib,"..\\debug\\cppdll.lib") //引入類的動態庫對應的靜態庫

int main()

Win32 靜態鏈結庫 一

1.這裡選擇的是win32靜態鏈結庫。libtest.h pragma once extern c int add int a int b libtest.cpp pragma once include libtest.h int add int a,int b 2.呼叫程式選擇 檔案 新建 空專案...

MFC動態鏈結庫和WIN32動態鏈結庫

1 dll的構成 每個應用程式都有乙個入口函式winmain,而每個dll也有乙個入口函式dllmain。dll跟應用程式一樣都含有資源 資料段和 段。dll跟應用程式的差別主要是dll有符號輸入表和符號輸出表,以方便應用程式呼叫dll中的函式。因為dll是由應用程式載入的,所以它本身沒有虛擬的記憶...

Win32 動態鏈結庫 二

1.檔案 新建 空專案 include windows.h include stdio.h pragma comment lib,debug xxp dll test.lib extern c declspec dllimport int addfun int a,int b 匯入動態鏈結庫的add...