1 背景
(1)將現有的能正常運行的qt項目轉化為dll,並在其他程序調用和顯示;
(2)已經在vs2019中裝了qt5.12.5的插件
2 思路
分兩步,先生成dll,然后再調用
3步驟
3.1 生成dll
(1)在vs中打開qt項目

如圖,依次點擊【擴展】——》【Qt VS Tools】——》【Open Qt Project File】,然后選擇要打開的Qt項目;
(2)配置屬性

a、打開項目的屬性文件,在【配置屬性】——》【常規】——》【配置類型】中選擇【動態庫(.dll)】;

b、在屬性文件的【連接器】——》【輸出文件】中,改為以.dll結尾的名稱;
(3)添加頭文件
a、添加定義宏的頭文件

如圖,在項目的heard files文件夾上,點擊鼠標右鍵,添加【新建項】,在新建項內選擇.h文件,並命名為XXX_global.h,在內容中添加如下代碼:
點擊查看代碼
#pragma once
#include <QtCore/qglobal.h>
#ifndef BUILD_STATIC
# if defined(SAMP8_2_LIB)
# define SAMP8_2_EXPORT Q_DECL_EXPORT
# else
# define SAMP8_2_EXPORT Q_DECL_IMPORT
# endif
#else
# define SAMP8_2_EXPORT
#endif

如上圖所示,在【屬性】——》【C/C++】——》【預處理器】——》【預處理器定義】,在里面添加頭文件中鏈接庫,即添加(SAMP8_2_LIB),頭文件中第4行代碼定義的啥,這里就輸入啥;
(b)添加函數接口頭文件
添加步驟同添加XXX_global.h的方式一樣,只是名字定義為XXX.h。在此文件中添加需要導出函數的聲明;
點擊查看代碼
#pragma once
#include "samp8_2_global.h"
class SAMP8_2_EXPORT Samp8_2
{
public:
Samp8_2();
};
extern "C" SAMP8_2_EXPORT int getVersion();
extern "C" SAMP8_2_EXPORT int realmain(int argc, char* argv[]);
點擊查看代碼
#include "widget.h"
#include <QApplication>
#include"samp8_2.h"
int realmain(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
這就可以生成dll文件了,一般可在當前項目的的debug文件夾下查看。
3.2調用dll
(1)創建一個qt應用程序

如上圖所示。添加一個Qt widgets Application。
(2)配置程序屬性
【a】配置附加包含目錄

如上圖所示,在應用的【屬性】——》【C/C++】——》【附加包含目錄】中,添加生成dll項目頭文件所在的目錄;
【b】配置鏈接器附加庫目錄

如上圖,在【屬性】——》【鏈接器】——》【附加庫目錄】中,將庫的.lib所在的路徑添加進來;
【c】配置鏈接器中的附加依賴項

如上圖,輸入庫的.lib名字;
【d】復制dll文件到應用程序的運行目錄下;
可以手動復制dll到應用程序的運行文件夾下,也可以通過設置命令行進行自動復制;自動復制的設置如下:

在【屬性】——》【生成事件】——》【生成后事件】——【命令行】。輸入
xcopy /y /d "..\..\MathLibrary\$(IntDir)samp8_2.dll(自己的dll的路徑,絕對/相對都可以)" "$(OutDir)"
3.3調用庫文件中的函數
int c = realmain(argc, argv);
參考文獻
【1】https://blog.csdn.net/snail2651/article/details/80902328
【2】https://docs.microsoft.com/zh-cn/cpp/build/dlls-in-visual-cpp?view=msvc-170
