关于Qt作为第三方库,QGIS二次开发作为第三方库,Qt ui编译的一些问题

今天在群里看到大佬说,他开发Qt的时候,没有配置Qt环境,直接把Qt按普通第三方库那样,引入头文件、lib、dll。他使用VS2017开发,但并未使用Qt VS Tools。使用UI的时候,他是直接用Qt Designer,手动 uic 编译,moc、rcc他也是手动的。大佬给团队讲的,都是不要用Qt creator,无非是手动跑一跑命令,嫌麻烦可以批处理,VS也可以设置编译选项。

大佬表示,他觉得Qt creator并不能提升效率,他不保证他的代码不会与Qt VS Tools插件、Qt creator冲突。

在这里放一下大佬的博客链接:http://caiyi.tech/

 

我对C++的第三方库的概念,对Qt作为第三方库、手动uic编译ui文件,以及“手动 moc 、rcc”等概念均不清晰,所以在此记录一下学习所得。

第三方库

之前在学习python的时候,知道python有很多第三方库,直接pip安装之后,import xx as xx就可以使用,非常方便。

第一方库:本工程中的各模块的互相依赖

第二方库:公司内部的依赖库,一般指公司内部开发的其他项目的jar包。

第三方库:公司之外的开源库,比如 apache、ibm、google等发布的依赖。

参考:https://blog.csdn.net/wangtingze123/article/details/84583004

我是这么理解的,第三方库是别人开发好的一些供我们使用的开源库,可以调动里面的api完成我们想要的一些功能。

VS中如何导入第三方库

库工程生成的三个核心文件是:xxx.h、xxx.lib、和xxx.dll。注意:并不是一定要同时存在三个文件,具体用哪个或哪两个文件,要根据你使用的情况而定,显式动态调用只需xxx.dll即可,隐式动态调用则必须要xxx.h和xxx.lib。

参考:https://blog.csdn.net/LittleLittleFish_xyg/article/details/83030430

在讲解下面的两种动态调用的时候,博主先手动生成了一个第三方库math用于讲解。

隐式动态调用

隐式动态调用:简单讲,就是告诉编译器,函数声明在头文件,函数定义在lib中。
隐式动态调用所需文件:xxx.h,和xxx.lib,两者缺一不可。隐式动态调用,有两种导入方式:
第一种导入方式:
1、包含头文件路径:xxx.h路径,即函数声明的文件路径
2、包含库文件路径;lib的路径
3、添加库文件名称;(声明所在)
4、在调用的位置添加头文件;(定义所在)
5、将 .dll丢到Pro.exe所在目录下。

包含头文件和库路径

在这里插入图片描述

添加链接库的名称
在这里插入图片描述

第二种导入方式
1、包含头文件路径;
2、添加头文件名称;
3、使用#pragma comment(lib,“库名称”);
4、将math.dll丢到Pro.exe所在目录下。

在这里插入图片描述

 在这里插入图片描述

 引入头文件,添加#pragma comment(lib,“库名称”)。并查看结果,注意库的路径名称。实际中一般处理方法是,库路径包含到math.lib的路径,#pragma comment(lib,“math.lib”),此处故意为之,目的是让新手能看懂。

在这里插入图片描述

显式动态调用:

显式动态调用:简单讲,当exe执行,需要调用dll的时候,加载这个dll,并找到对应函数的地址,然后调用方法。
导入方式:很粗暴,只需要dll即可,并不需要.h和.lib,这两个是在编译的时候告诉exe,dll中函数的地址,而显式调用,直接在运行时找函数地址,所以不需要提前告诉exe,函数在哪。
1、include ;此头文件中定义导入库的函数:LoadLibrary()
2、HMODULE hMod = LoadLibrary(“math.dll”);//dll路径
3、FUNA addfun = (FUNA)GetProcAddress(hMod, TEXT(“Add”));//直接写调用的函数名:Add,返回函数地址
4、addfun(a, b);直接调用。

在这里插入图片描述

库导出函数时候的细节情况

1、在隐式动态调用的时候,_declspec(dllexport) int Add(int a,int b),就可以调用动态库
2、在显式动态调用的时候,必须添加extern “C”,如extern “C”_declspec(dllexport) int Add(int a,int b),否则在寻找函数指针时失败。原因为C++有函数重载,编译器会改编函数名称,当extern "C"之后,就用C的方式命名,就能找到函数地址,其中还涉及到函数调用约定等知识,在后续再研究,再记录下来。在隐式动态调用中没有出现这个问题,是编译器帮忙做了一些工作,会绑定改名后的地址,所以不会失败。

接下来,了解了这些基础信息之后,我打算按照大佬的博客 http://caiyi.tech/,一步一步的跟着环境配置,了解一下整个引入过程。

属性管理器:https://blog.csdn.net/luoyu510183/article/details/83795054

你可能感兴趣的:(Qt)