文章目錄
- 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.h
和 mathTest.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