如何在QT中创建并引用库

基本操作流程:

1.在QT中新建一个库,包含(.pro & .h & _global.h & .cpp )

2.编写程序和库函数,执行 qmake(生成Makefil文件) 和build后,在和项目文件夹 [A] 并列的build…文件夹 [B]编写程序和库函数,执行 qmake(生成Makefil文件) 和build后,在和项目文件夹 [A] 并列的build…文件夹 [B] 中会生成.o(目标/执行文件)和.so(动态链接库)文件

3.引用该库时在项目的.pro中添加两行,注意检查是否与实际相符:引用该库时在项目的.pro中添加两行,注意检查是否与实际相符:

LIBS += *B文件夹的路径*
INCLUDEPATH += *A文件夹的路径*

备注:

  • 无需再在该项目的build…文件夹中加入调用的.so库文件
  • 程序中引用图片和.txt参数的内容,应该放在和执行文件一起的build…文件夹(此为程序执行时默认的当前文件夹)中;
  • QT的路径最好不要有中文;
  • 复制项目文件再别处重新编译运行时,删去项目文件夹中的.user文件;
  • 在新建库时,自动将头文件与源代码分开的好处是:你不必再与使用你的类的用户共享你的大多数源代码,你只需要提供头文件和编译过的目标文件就可以了.类用户将头文件包含到他们的每个模块中,然后再把你的目标文件添加到连接器的命令行中就可以使用了.

库(自己理解): 相当于把各类函数和类等打包起来编译好(封装),等其他程序需要用的时候,直接#include这个库的头文件(接口),既能调用原库中的函数和对象等内容
Makefile:编译生成的文件,bug始终调试不出时,可考虑将该文件删去重新生成
创建库参考https://blog.csdn.net/liang19890820/article/details/77450732
调用库中的函数参考https://www.librehat.com/linux-qt-to-create-and-call-a-shared-library-so-file/
XXX_global.h:是所有Library项目都有的头文件,选取要用的Qt模块的包含声明也在该文件内

.pro文件的书写

LIBS += //指定链接到项目中的库列表

  • 分为绝对路径和相对路径(相对于当前项目所在文件夹来说,加$$pwd前缀)
  • 路径中有<空格>的话需要添加""
  • -L指定库的目录,而-l指定库的名字(如果是在Linux下,则去掉lib和后缀名,windows下去掉后缀名即可),静态库、动态库都是一样的。

INCLUDEPATH +=  //指定编译项目时应该被搜索的#include目录

  • 引用的是第三方库时添加
  • 路径中用"+<换行>"分开,注意最后一行没有\符号

QT在编译链接第三方库时配置include目录
第一方是电脑自带的(比如图片\视频\邮件等软件库),
第二方是我后来装到电脑上的(QQ\微信\暴风等软件库),
第三方是我从github上下的开源代码?
参考:https://blog.csdn.net/stpeace/article/details/51870406
所以说我的slam程序中openCV\pcl等都算是第二方库,可以不INCLUDEPATH
Mr.肖:安装了的谷歌浏览器算二方的话,其上插件就算三方

动态和静态链接库

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
库有两种:静态库和动态库,所谓静态、动态是指链接。

静态库(.a、.lib):
在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库(在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,因此对应的链接方式称为静态链接),静态库浪费资源且不方便之后的更新改动

动态库(.so、.dll):
在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在.不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题

参考:https://blog.csdn.net/qq_41786318/article/details/79545018

重命名的一些操作

重命名项目名:在文件夹中对.pro文件重命名,其之后编译生成的build文件夹也会变
重命名.cpp/.h在项目中"rename"
重命名生成的二进制程序名:在 .pro 的 TARGET= 中改
文件夹名随便改,不过引用时要注意是否名称已更改

猜你喜欢

转载自blog.csdn.net/qq_40313712/article/details/84181855