Qt使用.lib静态库和.dll动态库文件

摘要:
_MYLIB_ H_INCLUDEMylib。cpp#include“mylib.h”#include intTestSum{return a+b;}void TestMessageBox(){MessageBox;}编译并生成动态库mylib。库。然后将main.cpp更改为:#include“test.h”#include#include”../MyLib/MyLib.h“#pragmacomment//因为某些Qt GUI程序不会加载user32.dll动态库,所以为了正常调用MessageBox,您需要显式加载user32。lib#pragmacommentitinmain{QApplicationa;Testw;w.show();TestSum(1,2);TestMessageBox();returna.exec();}我们将看到程序执行调用Windows API函数MessageBox。Mydll。load()){QMessageBox::about;}//获取测试导出函数地址pfnTestTest=mydll。决定intsum=测试(1,2);returna.exec();}

我安装的环境是Qt_5_8_0_MSVC2015_64bit,或许不同环境下编译有所不同,我就我自己的安装环境进行叙述一下吧。

1.添加一个新项目,作为静态库项目

Qt使用.lib静态库和.dll动态库文件第1张

2.选择静态库,并完成就可以了

Qt使用.lib静态库和.dll动态库文件第2张

这时候发现生成的项目是个空项目,需要我们自己进行添加.h和.cpp文件,我们建立两个文件mylib.h和mylib.cpp文件,代码如下:

mylib.h

#ifndef _MYLIB_H_INCLUDE
#define _MYLIB_H_INCLUDE

extern "C" int TestSum(int a, int b);
extern "C" void TestMessageBox();

#endif // !_MYLIB_H_INCLUDE

mylib.cpp

#include "mylib.h"

#include <Windows.h>
int TestSum(int a, int b)
{
    return a + b;
}

void TestMessageBox()
{
    MessageBox(NULL, L"Hello", L"World", 0);
}

编译生成动态库mylib.lib。

3.我们现在建立一个Qt GUI程序测试一下。

然后将main.cpp改为如下所示就可以了

#include "test.h"
#include <QtWidgets/QApplication>
#include "../MyLib/mylib.h"
#pragma comment(lib,"../x64/Debug/mylib.lib")
//因为Qt的GUI程序有的不会加载user32.dll动态库,所以为了正常调用MessageBox需要显式加载user32.lib
#pragma comment(lib,"user32.lib")

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Test w;
    w.show();

    TestSum(1, 2);
    TestMessageBox();

    return a.exec();
}

我们会看到程序执行调用了Windows API函数MessageBox。

4.我们这时候来测试一下动态库

新建一个动态库工程,更改dllmain.cpp如下:

#include "stdafx.h"
#include <Windows.h>

extern "C" int __declspec(dllexport) Test(int a, int b);

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        MessageBox(NULL, L"Success", L"Load", 0);
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

int Test(int a, int b)
{
    return a + b;
}

这个我们在一加载动态库时就可以弹出MessageBox,并导出了一个Test函数。

#include "test.h"
#include <QtWidgets/QApplication>
#include <QLibrary>
#include <QMessageBox>
#include "../MyLib/mylib.h"
#pragma comment(lib,"../x64/Debug/mylib.lib")
//因为Qt的GUI程序有的不会加载user32.dll动态库,所以为了正常调用MessageBox需要显式加载user32.lib
#pragma comment(lib,"user32.lib")


typedef int(*pfnTest)(int a, int b);//定义函数指针

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Test w;
    w.show();

    TestSum(1, 2);
    TestMessageBox();
    //声明所需要加载的动态库
    QLibrary mydll("../x64/Debug/mydll.dll");
    //加载动态库
    if (!mydll.load())
    {
        QMessageBox::about(NULL, "Defeated", "Load");
    }
    //获得Test导出函数地址
pfnTest Test = (pfnTest)mydll.resolve("Test"); int sum = Test(1, 2); return a.exec(); }

免责声明:文章转载自《Qt使用.lib静态库和.dll动态库文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WebSocket实时消息推送Unity之Bmob云存储一下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【jsp】jsp中的动作元素

一,动作元素(Action):预定义的java代码。目的在于代码的可重用性。  1,为请求阶段提供信息,允许在页面之间转移控制权。  2,JSP2.0规范定义了标准动作,标准动作是一些标签,影响JSP运行时的行为和对客户请求的响应。在页面被转换为Servlet时,JSP容器遇到这些标签,就使用预先定义的对应于该标签的java代码来代替它。  3,动作元素语...

Android中的&amp;amp;lt;include&amp;amp;gt;标签和&amp;amp;lt;merge&amp;amp;gt;标签

android开发中经常会碰到某一个布局的复用;直接拷贝粘贴并不是是有效的策略,这时候就能够借助<include>标签和<merge>标签来完毕。 官方文档: http://developer.android.com/training/improving-layouts/reusing-layouts.html 1. <...

C++访问WebService gSoap方式

一、 gSOAP访问WebService 1. 下载gSOAP gSOAP 2.7.17 版下载地址http://sourceforge.net/projects/gsoap2/) 2. 安装gSOAP 解压下载的gsoap_2.7.17.zip,假设该路径为F:WebServicegsoap-2.7 3. 通过WSDL生成C++头文件 3.1、通...

动态链接库(DLL)

动态链接库和静态链接库: 动态链接库一般不能直接执行,而且它们一般也不接收消息。 它们是包含许多函数的独立文件,这些函数可以被应用程序和其他 DLL 调用以完成某些特定的工作。 一个动态链接库只有在另外一个模块调用其所包含的函数时才被启动。 “静态链接” 一般是在程序开发过程中发生的,用于把一些文件链接在一起创建一个 Windows 可执行文件。 这些文件...

编程珠玑---读书笔记---堆的实现及堆排序

堆是用来表示元素集合的一种数据结构。与“堆内存”不同。堆的性质,第一:顺序性:任何结点的值都小于或者等于其子结点的值,这意味着最小元素位于根结点。 最大顶堆跟这个相反。第二个性质是形状:一种二叉树,最底层的叶子结点尽可能靠左分布,如果有n个结点,那么所有结点到根的距离不会超过logn。 下面用vector来实现堆: 我们规范的从下标1开始,函数定义如下...

VS2015配置OpenCV,使用mfc摄像头程序测试

转自:https://blog.csdn.net/Lee_Dk/article/details/80466523 这只是介绍了如何加入OpenCV,怎么查找OpenCV请看出处。  新建一个项目。找到属性管理器,debug-win32。后4个是原本就有的。Micross.Cpp.Win32.user是vs的默认属性表,如果在这个表中配置了,以后的项目都不用...