Qt学习及踩坑日记(CMakeList的使用)
因为项目用到Qt,是急用,所以没有系统学习,仅根据项目所需,记录一下自己学习以及踩坑流程,给0基础小白一点启发。
本人是Qt小白,所以有描述错误或者不准确的内容,请大佬们指点出来并见谅。
1、项目的大概背景
在嵌入式开发板Jetson Xavier上进行编译的,直接在开发板上编译的,没有用到交叉编译。系统是Ubuntu。软件版本Qt5.9。
一个基于TensorRT的检测设备,利用到了外部库有深度学习推理加速库TensorRT,cudnn库,opencv库,海康威视工业相机的二次开发库等。本文主要介绍是基于项目所用到的Qt知识以及踩过的坑,不会详细介绍项目。
2、软件整体的构建
由于考虑到到cmake用途广泛,因此本人用CMakeList进行软件整体的构建,并没有采用qmake,关于CMakeList的学习以及踩坑记录:
主要介绍一下几个库的调用和生成,本人喜欢将主程序以为的函数封装到库里,方便调用。
2.1、调用opencv库
这个比较简单,如果编译不了的话,网上也有许多教程。这里就不重复前人的工作了
find_package(OpenCV 4 REQUIRED)
2.2、调用海康威视相机的的二次开发库
这里就是一个简单的外部库的调用,将所用到的头文件,以及库调用即可,这里有个踩坑点,当时以为调用库文件是用link_libraries
,后来试了好几次,项目一直不能成功调用相机的二次开发库,后来百度了一下才知道,link directories(添加需要链接的库文件目录
),而link_libraries(添加需要链接的库文件路径,注意这里是全路径)
,因为项目所用的库文件不止一个,而是目录下面所有,所以应该用link_directories
。
include_directories("/opt/MVS/include")
#not link_libraries ,is link directories
link_directories("/opt/MVS/lib/aarch64")
2.3、生成自己的库文件
这里用一个所写的目标跟踪的库为例,目标跟踪用来sort算法,原版是python,我写成了c++,这里将它封装为库,方便主程序调用。
file
是加载目录下的.cpp文件作为源文件,然后用set
设置一下编译选项和将opencv库文件作为sort所使用的库文件,接下来用include_directories
调用所需的头文件,包括自己写的头文件以及所调用库的头文件,最后用add_library
生成共享库并用target_link_libraries
链接所需的库文件,方便后续调用。
file(GLOB sort_SRC "sort/*.cpp")
set(sort_LIBS ${OpenCV_LIBS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/sort ${OPENCV_INCLUDE_DIRS})
add_library(sort SHARED ${sort_SRC})
target_link_libraries(sort ${sort_LIBS})
2.4、主程序的构建
这里有个踩坑点,就是有时候ui界面不更新,所以就加上了include_directories("../build/gui_autogen/include")
这就话,如果你自己项目ui界面正常更新,可以不用这句话,这个具体原因不知道,就知道这个方法可以解决ui界面不更新的问题。
首先就是调用所用到Qt模块,后面的几个set我也根据前人的经验添加上去的,接下来利用add_executable
生成可执行文件,最后就是链接前面所述的外部库文件,以及自己生成的库文件。
find_package(Qt5Widgets)
find_package(Qt5Core)
find_package(Qt5Gui)
#引入ui文件,ui_mainwindow.h
include_directories("../build/gui_autogen/include")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLIDE_CURRENT_DIR ON)
add_executable(gui
main.cpp
mainwindow.ui
mainwindow.cpp
ch_test.cpp
ch_test.ui
)
qt5_use_modules(gui Widgets)
target_link_libraries(gui Qt5Widgets Qt5Core Qt5Gui)
target_link_libraries(gui myDNN sort)
target_link_libraries(gui -lMvCameraControl)
未完待续。。。。。。。。。。