如何在Qt中写自己的静态连接库

如何在Qt中写自己的静态连接库,第1张

1、首先在*.pro文件中添加如下代码

    LIBS        += -L/$$PWD/your_lib_dir/your_lib.a

    INCLUDEPATH += $$PWD/your_lib_include_path

2、然后在需要使用地方添加头文件,引用即可。

   #include "mylib.h"

   void test()

   {

       MyLib::test()

   }

qt中添加windows vs 生成的静态库,需要注意:

qt使用的编译器版本要和vs版本, *** 作系统位数要对应。

例如:用  vs2015 x86生成的了release 和debug两种静态库

相应的QT也要配置vs2015 32 编译器。

把之前vs 生成的静态库的头文件和库准备好

打开qt 中打卡 工程  .pro文件 右键选择 添加库选择外部库

这样我们release和debug版的静态库都添加近工程了。

如果之前已经生成过编译后的文件夹

再次生成时可能遇到 error LNK2019: 无法解析的外部符号 之类的错误信息。

这个问题只要把上面的文件夹删除,从新编译即可。

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()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11902836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存