主要内容
如标题所示,在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问题的解决方法
|