文章目錄
- 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.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"/*創建靜態庫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