vs編譯的庫給qt用
① 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();
}