转载请注明出处。
文章地址:https://blog.csdn.net/duiwangxiaomi/article/details/119001445?spm=1001.2014.3001.5501
主要内容
如标题所示,在linux下使用qtcreator创建项目调用C++库文件,并成功运行。
一、编程环境及实现方法
系统:ubuntu16.04
IDE:Qtcreator5.9.9
编程语言:C++
第三方库:opencv2.4.13.6
自制C++共享库:libdisplay.so
实现方法:创建一个新项目,调用自制C++的库文件,显示一张图片,测试库文件是否能正常使用。
二、项目实现
1.创建项目
进行新项目创建,编写调用库文件的C++程序。
-
文件-新建文件或项目
-
由于是非ui项目,且创建项目后直接导入现有C++文件,选择 “其他项目”-“空qmake项目”
-
填写项目名及项目保存路径,下面2步直接默认,完成创建项目。
-
导入头文件、主程序文件
编辑模式下,选中工程目录点击右键,“添加现有文件”,添加所需文件(主要是 .cpp 和 .h 文件)
添加完成后,qtcreator会自动识别是头文件或源文件,生成相应目录,如下图所示。
头文件libdisplay.h
int displayPic();
源文件 displaypic_callso.cpp
#include "./include/libdisplay.h"
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
displayPic();
waitKey();
return 0;
}
2.导入库文件
将调用的库文件导入,编译程序及运行。
- 工程目录右键-添加库-外部库-选择.so库文件对应的文件及文件夹
完成后,在项目的.pro文件中自动增加了如下内容,即libdisplay.so库文件添加成功。
- 文件导入成功,进行项目编译,生成可执行文件,然后将图片放在可执行文件所在文件夹,运行程序。
三、项目中遇到的问题
-
找不到头文件
问题描述:刚开始包含头文件直接写的是#include "libdisplay.h"
,显示找不到头文件,后改为#include "./include/libdisplay.h
正常(注:本工程头文件是在子文件夹下)
解决方法:- 如果头文件在工程文件夹目录下(不包括工程文件夹下的子文件夹),那一般先检查仔细是否头文件名字写错了,如果正确可以build clean然后重新构建一下
- 如果是头文件在工程文件夹子文件夹下,那么可参考.pro文件的.h路径,在包含该头文件时也一定要有这个路径
-
修改默认构建目录
问题描述: 生成的build文件夹不在保存工程的文件夹下,而是与保存工程的文件夹同级,为了管理方便,修改默认构建目录保存路径至工程所在文件夹下。默认的构建目录:工具–选项—构建和运行—概要—Default build directory
默认为:../build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}1)../ 表示当前目录的父目录(这部分用来指定构建目录处在什么位置,其中当前目录是指当前工程目录下)
2)build- 固定不变字符,在目录名中原样显示
3)%{CurrentProject:Name} 变量值,表示当前的工程名
4)- 固定不变字符,在目录名中原样显示
5)%{CurrentKit:FileSystemName} 变量值,当前构建套件名
6)- 固定不变字符,在目录名中原样显示
7)%{CurrentBuild:Name} 变量值,表示当前构建类型,比如是Debug还是Release
解决方法:
1) 工具–选项—构建和运行—概要—Default build directory,修改build文件保存路径,本文项目改为“./build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}”,即保存在当前工程目录下,文件名按默认输出。
注意:修改构建目录对当前正在打开的工程无效,需要在下一次使用Qt Creator新建工程时才开始起效。
2) 若想此项目生效,需删除.pro.user文件,重新打开项目,重新创建项目:工程模式下,点击配置工程,如图所示,配置完成后,编译运行,生成的build文件夹就在工程文件夹下了。
-
编译出现:
-1: error: cannot find -lGL
问题
问题描述:产生问题的原因是由于Qt 找不到 OpenGL 的动态链接库(libGL.so)。OpenGL 在大部分 Linux 发行版中都是默认安装的,包括 Ubuntu、CentOS 等,找不到该链接库一般都是路径不对。
Qt 默认在 /usr/lib/ 目录下查找动态链接库,但是很多 Linux 发行版将 OpenGL 链接库放在其它目录,例如我使用的是 CentOS 7,OpenGL 链接库位于 /usr/lib64/ 目录,而对于 Ubuntu,OpenGL 链接库位于 /usr/lib/x86-linux-gnu/mesa/ 目录。只要我们把 libGL.so 拷贝到 /usr/lib/ 目录,或者在 /usr/lib/ 目录下为 libGL.so 创建一个链接,就能解决问题。
解决方法:
Ubuntu自带的 OpenGL 链接库在后缀中添加了版本号,但是 Qt 在链接阶段查找的 OpenGL 链接库是不带版本号的。因此,可以在 /usr/lib/ 目录下为 OpenGL 链接库创建一个链接。
可通过 locate libGL命令查找 OpenGL 链接库所在路径。创建软链接,终端输入如下命令(普通用户可能无权限创建链接,可使用root用户)
sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so
4. 编译报错:/usr/local/lib/libopencv_highgui.so.2.4:-1: error: error adding symbols: DSO missing from command line
原因:未找到库文件。
解决方法:按“二、项目实现”-“2.导入库文件”,将缺失的库文件导入,重新编译项目即可。
总结
刚开始接触相关内容,记录下过程,方便自己也方便他人,欢迎讨论。
如果觉得本文写的不错的,欢迎点赞、收藏、评论哦~
参考链接:
1.Qt入门学习——Qt Creator的使用
2.Qt Creator怎样更改默认构建目录
3.Linux的Qt编译出现👎 error: cannot find -lGL问题的解决方法