前言
之前對於dll的鏈接無非是抽象出來的公共方法,但是不知道的是,整個C++項目可以完整的打包成DLL文件,而且打包後然後新建項目在調用。
過程
打包環境:Visual Studio2019
步驟:打開Visual Studo2019,點擊“文件”->“新建
”->”項目
”,選擇“動態鏈接庫
”模板如下同,然後點擊下一步,
在配置新項目欄目輸入“項目名稱
”,選擇“位置
”,然後勾選中“將解決方案和項目放在同一目錄中
”,點擊“創建
”。
將解決方案中的pc.h文件編輯更改如下:
#ifndef PCH_H
#define PCH_H
#include "framework.h"
#endif
#ifdef IMPORT_DLL
#else
#define IMPORT_DLL extern "C" _declspec(dllimport)
#endif
IMPORT_DLL int pch();
將原來項目源代碼中main.cpp
文件裏面的代碼複製到原有的“pch.h
”文件代碼的尾部,將原先的main函數名改爲pch函數名,使其缺少main入口函數。需要注意的是pch函數是我們爲項目提供的接口函數。
在Visual Studio2019中右擊”解決方案
”->”在文件資源管理器中打開文件夾
”。
然後選擇原來項目源代碼中帶.h
的頭文件,將其複製到打開的文件夾中,在複製完在選中複製後的帶.h的頭文件將其複製添加到解決方案的頭文件(注意:此處要保證複製的文件在打開的文件夾位置中,而非原來的原項目源碼位置)。
同理,選擇原來項目源代碼中帶.cpp
的頭文件,將其複製到打開的文件夾中,在複製完在選中複製後的帶.cpp
的頭文件將其複製添加到解決方案的源文件中。
操作完後,打開原來的pch.cpp
文件,按住Ctrl鍵點擊自定義include的頭文件,如果彈出警告”在當前源文件的目錄或生成系統路徑中未找到文件*.h
”時,請先點擊確定關閉警告框。然後在解決方案的下一層目錄(即以項目名爲標誌)處右擊,點擊“重新掃描解決方案
”。再次測試時即解決這個警告。
最後”運行”,在本機中點擊“本地Windows調試器
”,若提示錯誤:在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加“#include”pch.h
”,則點擊Visual Studio2019中的“項目
”->“項目名屬性
”->”C/C++
”->”預編譯頭
”,將右側的預編譯頭由“使用(/Yu)”調換到“不使用預編譯頭
”,然後點擊“應用
”->”確定
”。
再次運行時即能正確運行,若輸出顯示” ========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========
”即爲成功,此時會彈出錯誤框。”顯示無法啓動dll,dll不是有效的Win32應用程序。
”,我們關閉即可,dll必須由其他程序調用。此時我們在項目目錄中的Debug目錄下找到生成的*.dll文件。
我們新建一個“控制檯應用
”程序,將默認帶輸出”Hello World!”的文件裏面代碼更改如下:
#include <iostream>
#include "Windows.h"
int main()
{
HINSTANCE hDllInst;
hDllInst = LoadLibrary(L"case1_part1_dll.dll"); //換成自身的dll文件名
typedef int(*PLUSFUNC)(); //後邊爲參數,前面爲返回值
PLUSFUNC plus_str = (PLUSFUNC)GetProcAddress(hDllInst, "pch"); //GetProcAddress爲獲取該函數的地址
std::cout << plus_str();
}
然後在Visual Studio2019中右擊”解決方案
”->”在文件資源管理器中打開文件夾
”。將之前生成的*.dll
文件夾複製此,並將原項目的資源文件
複製到此,若有其他資源文件依次操作即可。
然後點擊“本地Windows調試器
”,可以發現程序正常運行啓動。
後記
更多關於DLL打包的問題可以相互交流溝通。