當前位置:首頁 » 編程軟體 » vs編譯的庫給qt用

vs編譯的庫給qt用

發布時間: 2023-08-19 12:40:15

① qt 5添加 windows 靜態庫

qt中添加windows vs 生成的靜態庫,需要注意:

qt使用的編譯器版本要和vs版本,操作系統位數要對應。

例如:用  vs2015 x86生成的了release 和debug兩種靜態庫

相應的QT也要配置vs2015 32 編譯器。

把之前vs 生成的靜態庫的頭文件和庫准備好

打開qt 中打卡 工程  .pro文件 右鍵選擇 添加庫選擇外部庫

這樣我們release和debug版的靜態庫都添加近工程了。

如果之前已經生成過編譯後的文件夾

再次生成時可能遇到 error LNK2019: 無法解析的外部符號 之類的錯誤信息。

這個問題只要把上面的文件夾刪除,從新編譯即可。

② MinGW的QT怎麼調用VC生成的靜態鏈接庫

Qt如何調用VC++生成的動態鏈接庫?假設當前有VC++編譯器生成的動態庫文件testdll.h,testdll.lib和testdll.dll。

testdll.h文件源碼如下:

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
// 此類是從 testdll.dll 導出的
class TESTDLL_API Ctestdll {
public:
Ctestdll(void);
public:
int Add(int a, int b) {return a+b;}
int Sub(int a, int b) {return a-b;}
int Mul(int a, int b) {return a*b;}
};
extern TESTDLL_API int ntestdll;
TESTDLL_API int fntestdll(void);

Qt如何使用這些動態鏈接庫文件?

一、情況1,編程環境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010)

Qt庫是VS2010版本,VC++編譯器生成的。所以工程可以直接使用testdll.h頭文件和testdll.lib引入庫文件。

1、把testdll.h拷貝到工程路徑;

2、工程文件XXX.pro需要手動添加"HEADERS += testdll.h"和"LIBS += testdll.lib";

3、編譯前,需要把lib文件:testdll.lib和testdll.dll一起拷貝到構建路徑下面。

如此便可以正常使用VC++動態鏈接庫函數。

二、情況2,編程環境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2)

Qt庫是MinGW版本,gcc編譯器生成,與VC++編譯器不是同個體系。所以工程不可以使用testdll.h頭文件和testdll.lib引入庫文件。

對於調用DLL的方法,Qt本身就有相應的類來實現。

#include "dialog.h"
#include <QApplication>
#include <QLibrary>

typedef int (*func_Add)(int a, int b); //定義函數指針
typedef int (*func_Sub)(int a, int b);
typedef int (*func_Mul)(int a, int b);

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QLibrary mylib("testdll.dll");//testdll.dll的存放路徑與.exe一致
if (mylib.load())
{
//"?Add@Ctestdll@@QAEHHH@Z"等字元串其實就是動態庫函數int Add(int a, int b)的變體,請使用微軟工具DEPENDS.EXE查看得到
func_Add f1 = (func_Add)mylib.resolve("?Add@Ctestdll@@QAEHHH@Z");
func_Sub f2 = (func_Sub)mylib.resolve("?Sub@Ctestdll@@QAEHHH@Z");
func_Mul f3 = (func_Mul)mylib.resolve("?Mul@Ctestdll@@QAEHHH@Z");
int rt = 0;

if (f1 != NULL)
{
rt = f1(10, 12);
}

if (f2 != NULL)
{
rt = f2(10, 12);
}

if (f3 != NULL)
{
rt = f3(10, 12);
}
}

Dialog w;
w.show();

return a.exec();
}

熱點內容
整數是數存儲 發布:2025-02-04 11:39:44 瀏覽:694
12123六位密碼是多少 發布:2025-02-04 11:34:43 瀏覽:797
奧賽編程課 發布:2025-02-04 11:33:59 瀏覽:376
無法打開共享文件夾 發布:2025-02-04 11:29:50 瀏覽:635
電腦配置有哪些方面要求 發布:2025-02-04 11:27:38 瀏覽:525
安卓手機的米加大學什麼時候更新 發布:2025-02-04 11:26:39 瀏覽:705
長城哈弗f5潮版有哪些配置 發布:2025-02-04 11:24:22 瀏覽:540
編程兩階段 發布:2025-02-04 11:23:00 瀏覽:154
倒鉤編程 發布:2025-02-04 11:13:48 瀏覽:470
記事本如何加密 發布:2025-02-04 11:13:37 瀏覽:119