演練:建立和使用靜态庫
在本演練中,您将建立一個靜态庫 (LIB),其中包含可供其他應用程式使用的有用例程。使用靜态庫是重用代碼的一種絕佳方式。您不必在自己建立的每個程式中重新實作這些例程,而隻需對這些例程編寫一次,然後從需要該功能的應用程式引用它們即可。
本演練涵蓋以下内容:
建立新的靜态庫項目
向靜态庫添加類
建立引用靜态庫的應用程式
在控制台應用程式中使用靜态庫的功能
運作應用程式
先決條件
本主題假定您具備 C++ 語言的基礎知識。
從“檔案”菜單中,選擇“建立”,然後選擇“項目…”。
從“項目類型”窗格中,選擇“Visual C++”下的“Win32”。
從“模闆”窗格中,選擇“Win32 控制台應用程式”。
為項目選擇一個名稱,如“MathFuncsLib”,并将其輸入“名稱”字段。為解決方案選擇一個名稱,如“StaticLibrary”,并将其輸入“解決方案名稱”字段。
按“确定”啟動 Win32 應用程式向導。在“Win32 應用程式向導”對話框的“概述”頁中,按“下一步”。
從“Win32 應用程式向導”的“應用程式設定”頁中,選擇“應用程式類型”下的“靜态庫”。
從“Win32 應用程式向導”的“應用程式設定”頁中,取消選擇“附加選項”下的“預編譯頭”。
按“完成”建立項目。
若要為新類建立頭檔案,請從“項目”菜單中選擇“添加新項…”。将顯示“添加新項”對話框。從“類别”窗格中,選擇“Visual C++”下的“代碼”。從“模闆”窗格中選擇“頭檔案(.h)”。為頭檔案選擇一個名稱,如“MathFuncsLib.h”,并按“添加”。将顯示一個空白檔案。
添加一個名為“MyMathFuncs”的簡單類,以執行常見的算術運算,如加、減、乘和除。代碼應與以下内容類似:
// MathFuncsLib.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a - b
static double Subtract(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static double Divide(double a, double b);
};
}
若要為新類建立源檔案,請從“項目”菜單中選擇“添加新項…”。将顯示“添加新項”對話框。從“類别”窗格中,選擇“Visual C++”下的“代碼”。從“模闆”窗格中,選擇“C++ 檔案(.cpp)”。為源檔案選擇一個名稱,如“MathFuncsLib.cpp”,并按“添加”。将顯示一個空白檔案。
在源檔案中實作“MyMathFuncs”的功能。代碼應與以下内容類似:
// MathFuncsLib.cpp
// compile with: /c /EHsc
#include "MathFuncsLib.h"
#include <stdexcept>
using namespace std;
double MyMathFuncs::Add(double a, double b)
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
return a - b;
double MyMathFuncs::Multiply(double a, double b)
return a * b;
double MyMathFuncs::Divide(double a, double b)
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
若要将項目生成為靜态庫,請從“項目”菜單中選擇“MathFuncsLib屬性…”。從左窗格中,選擇“配置屬性”下的“正常”。從右窗格中,将“配置類型”更改為“靜态庫(.lib)”。按“确定”儲存更改。注意
如果是從指令行生成,必須分兩個步驟來生成程式。首先,使用帶編譯器選項 /c 的 Cl.exe 編譯代碼 (cl /c /EHsc MathFuncsLib.cpp)。這将建立名為“MathFuncsLib.obj”的對象檔案。有關更多資訊,請參見 /c(編譯但不連結)。接着,使用庫管理器 Lib.exe 連結代碼 (lib MathFuncsLib.obj)。這将建立靜态庫“MathFuncsLib.lib”。有關庫管理器的更多資訊,請參見 LIB 引用。
編譯該靜态庫,方法是選擇“生成”菜單中的“生成解決方案”。這将建立一個可供其他程式使用的靜态庫。
若要建立引用并使用剛剛建立的靜态庫的應用程式,請從“檔案”菜單中選擇“建立”,然後選擇“項目…”。
為項目選擇一個名稱,如“MyExecRefsLib”,并将其輸入“名稱”字段。從“解決方案”旁邊的下拉清單中選擇“添入解決方案”。這會将新項目添加到該靜态庫所屬的同一個解決方案中。
按“确定”啟動“Win32 應用程式向導”。在“Win32 應用程式向導”對話框的“概述”頁中,按“下一步”。
從“Win32 應用程式向導”的“應用程式設定”頁中,選擇“應用程式類型”下的“控制台應用程式”。
建立新的控制台應用程式後,将為您建立一個空程式。源檔案的名稱與您在前面為項目選擇的名稱相同。在本示例中,名為“MyExecRefsLib.cpp”。
若要使用在靜态庫中建立的算術例程,必須引用該靜态庫。為此,請選擇“項目”菜單中的“引用…”。在“屬性頁”對話框中,展開“通用屬性”節點,并選擇“引用”。然後選擇“添加新引用…”按鈕。有關“引用…”對話框的更多資訊,請參見“<Projectname> 屬性頁”對話框 ->“通用屬性”->“引用”。
将顯示“添加引用”對話框。此對話框列出了所有可以引用的庫。“項目”頁籤列出了目前解決方案中的所有項目,以及它們包含的所有庫。從“項目”頁籤中,選擇“MathFuncsLib”。然後選擇“确定”。有關“添加引用”對話框的更多資訊,請參見“添加引用”對話框。
若要引用靜态庫的頭檔案,必須修改包含目錄路徑。為此,請在“屬性頁”對話框中,展開“配置屬性”節點,然後展開“C/C++”節點,并選擇“正常”。在“附加包含目錄”旁邊,鍵入“MathFuncsLib.h”頭檔案所在的位置的路徑。
現在,可以在應用程式中使用“MyMathFuncs”類了。使用以下代碼替換“MyExecRefsLib.cpp”的内容:
// MyExecRefsLib.cpp
// compile with: /EHsc /link MathFuncsLib.lib
#include <iostream>
int main()
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
return 0;
通過從“生成”菜單中選擇“生成解決方案”,生成可執行檔案。
確定選擇“MyExecRefsLib”作為預設項目。從“解決方案資料總管”中,選擇“MyExecRefsLib”,然後選擇“項目”菜單中的“設為啟動項目”。
若要運作項目,請選擇“調試”菜單中的“開始執行(不調試)”。輸出應如下所示:
a + b = 106.4
a - b = -91.6
a * b = 732.6
a / b = 0.0747475
演練:建立和使用動态連結庫
在本演練中,您将建立一個動态連結庫 (DLL),其中包含可供其他應用程式使用的有用例程。使用 DLL 是一種重用代碼的絕佳方式。您不必在自己建立的每個程式中重新實作這些例程,而隻需對這些例程編寫一次,然後從需要該功能的應用程式引用它們即可。
建立新的動态連結庫 (DLL) 項目
向動态連結庫添加類
建立引用動态連結庫的應用程式
在控制台應用程式中使用類庫的功能
從“項目類型”窗格中選擇“Visual C++”下的“Win32”。
為項目選擇一個名稱,如“MathFuncsDll”,并将其輸入“名稱”字段。為解決方案選擇一個名稱,如“DynamicLibrary”,并将其輸入“解決方案名稱”字段。
從“Win32 應用程式向導”中的“應用程式設定”頁中,選擇“應用程式類型”下的“DLL”(如果可用),或者選擇“控制台應用程式”(如果“DLL”不可用)。某些 版本的 Visual Studio 不支援使用向導建立 DLL 項目。您可以稍後對此進行更改,以将項目編譯為 DLL。
從“Win32 應用程式向導”的“應用程式設定”頁中,選擇“附加選項”下的“空項目”。
若要為新類建立頭檔案,請從“項目”菜單中選擇“添加新項…”。将顯示“添加新項”對話框。從“類别”窗格中,選擇“Visual C++”下的“代碼”。從“模闆”窗格中,選擇“頭檔案(.h)”。為頭檔案選擇一個名稱,如“MathFuncsDll.h”,并按“添加”。将顯示一個空白檔案。
// MathFuncsDll.h
static __declspec(dllexport) double Add(double a, double b);
static __declspec(dllexport) double Subtract(double a, double b);
static __declspec(dllexport) double Multiply(double a, double b);
static __declspec(dllexport) double Divide(double a, double b);
請注意上面的方法聲明中的 __declspec(dllexport) 修飾符。這些修飾符使 DLL 能夠導出該方法以供其他應用程式使用。有關更多資訊,請參見 dllexport, dllimport。
若要為新類建立源檔案,請從“項目”菜單中選擇“添加新項…”。将顯示“添加新項”對話框。從“類别”窗格中,選擇“Visual C++”下的“代碼”。從“模闆”窗格中,選擇“C++ 檔案(.cpp)”。為源檔案選擇一個名稱,如“MathFuncsDll.cpp”,并按“添加”。将顯示一個空白檔案。
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
若要将項目生成為 DLL,請從“項目”菜單中選擇“MathFuncsDll,再選擇“屬性…”。從左窗格中,選擇“配置屬性”下的“正常”。從右窗格中,将“配置類型”更改為“動态庫(.dll)”。按“确定”儲存更改。注意
如果是從指令行生成,請使用 /LD 編譯器選項指定輸出檔案應為 DLL。有關更多資訊,請參見 /MD、/MT、/LD(使用運作時庫)。
編譯該動态連結庫,方法是選擇“生成”菜單中的“生成解決方案”。這樣就建立了一個可供其他程式使用的 DLL。有關 DLL 的更多資訊,請參見 DLL。
若要建立引用并使用剛剛建立的動态連結庫的應用程式,請從“檔案”菜單中選擇“建立”,然後選擇“項目…”。
為項目選擇一個名稱,如“MyExecRefsDll”,并将其輸入“名稱”字段。從“解決方案”旁邊的下拉清單中選擇“添入解決方案”。這會将新項目添加到該動态連結庫所屬的同一個解決方案中。
建立新的控制台應用程式後,将為您建立一個空程式。源檔案的名稱與您在前面為項目選擇的名稱相同。在本示例中,名為“MyExecRefsDll.cpp”。
若要使用在動态連結庫中建立的算術例程,必須引用該動态連結庫。為此,請選擇“項目”菜單中的“引用…”。在“屬性頁”對話框中,展開“通用屬性”節點,并選擇“引用”。然後選擇“添加新引用…”按鈕。有關“引用…”對話框的更多資訊,請參見“<Projectname> 屬性頁”對話框 ->“通用屬性”->“引用”。
将顯示“添加引用”對話框。此對話框列出了所有可以引用的庫。“項目”頁籤列出了目前解決方案中的所有項目,以及它們包含的所有庫。從“項目”頁籤中,選擇“MathFuncsDll”。然後選擇“确定”。有關“添加引用”對話框的更多資訊,請參見“添加引用”對話框。
若要引用動态連結庫的頭檔案,必須修改包含目錄路徑。為此,請在“屬性頁”對話框中,展開“配置屬性”節點,然後展開“C/C++”節點,并選擇“正常”。在“附加包含目錄”旁邊,鍵入“MathFuncsDll.h”頭檔案所在的位置的路徑。
動态連結庫僅在運作時由可執行檔案加載。必須告訴系統在哪裡查找“MathFuncsDll.dll”。這是使用 PATH 環境變量實作的。為此,請在“屬性頁”對話框中,展開“配置屬性”節點,并選擇“調試”。在“環境”旁邊,鍵入以下内容:PATH=<path to MathFuncsDll.dll file>,其中 <path to MathFuncsDll.dll file> 應替換為“MathFuncsDll.dll”的實際位置。按“确定”儲存進行的所有更改。注意
如果要從指令行而不是從 Visual Studio 内運作可執行檔案,必須從指令提示處手動更新 PATH 環境變量,如下所示:set PATH=%PATH%;<path to MathFuncsDll.dll file>,其中 <path to MathFuncsDll.dll file> 應替換為“MathFuncsDll.dll”的實際位置。
現在,可以在應用程式中使用“MyMathFuncs”類了。使用以下代碼替換“MyExecRefsDll.cpp”的内容:
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
確定選擇“MyExecRefsDll”作為預設項目。從“解決方案資料總管”中,選擇“MyExecRefsDll”,然後選擇“項目”菜單中的“設為啟動項目”。