网站菜单

ARM嵌入式开发——Ubuntu下基于CLion搭建QT与OpenCV交叉编译开发环境

关键词:Ubuntu,ARM,QT,OpenCV,交叉编译

关于OpenCV与QT的交叉编译,可以参考前面的文章:

OpenCV交叉编译

QT交叉编译

1. 使用CLion新建工程

使用CLion创建一个QT工程(2020.3以后的版本才有,如果没显示QT项目,等待一会儿就会出来),QT Cmake的前缀路径可以不选择

载入以后,因为在前文中,笔者自定义了QT的安装路径,因此需要在CMakeList中指定出来对应的路径。

#QT Location
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/gt_cross")

find_package(Qt5 COMPONENTS
        Core
        Gui
        Widgets
        REQUIRED)

#Link libraries
target_link_libraries(untitled1
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        )

OpenCV同理,前文有详细介绍,因此跳过。(make的时候笔者路径将qt写成了gt,因此后面的路径为gt,直接复制粘贴的话需要注意一下)

针对QT,还要添加一些设置。整体下来CMakeList.txt文件长这样。

cmake_minimum_required(VERSION 3.22)
project(untitled1)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)


#QT Location
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/gt_cross")

find_package(Qt5 COMPONENTS
        Core
        Gui
        Widgets
        REQUIRED)

#OpenCV Location
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/share/OpenCV")
find_package(OpenCV REQUIRED)
if(NOT OpenCV_FOUND)
    message(WARNING "OpenCV not found!")
else()
    #add head file
    include_directories(${OpenCV_INCLUDE_DIRS})
endif()

add_executable(untitled1
        Sources/main.cpp
        )

#Link libraries
target_link_libraries(untitled1
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        )

target_link_libraries(untitled1 ${OpenCV_LIBS})


这时候编译,即可以看到编译成功了,生成了一个写着HelloWorld的pushbutton。

2. 重构项目目录

因为使用QT项目,每生成一个.cpp文件会生成一个对应的.h头文件,若不早点分类等项目大了以后就很难处理。因此,根据笔者的QT Creator的使用习惯,对项目目录进行重建。

结构如下:

  • 我们新建了一个Sources文件夹用于保存所有的QT源文件,在Sources下,FormsHeaders分别存放UI文件和.h头文件,所有的cpp源文件直接放在Sources目录下,这里在新建好文件夹之后,只需要把main.cpp直接拖拽到Sources下即可,clion 会自动帮我们处理cmake文件中路径的问题。
  • lib目录存放我们之后需要的MQTT第三方库的 .dll文件和.a文件
  • include目录存放第三方库的头文件

3. 新建界面UI类

在项目根目录右键,新建,选择QT UI类。给这个UI类起一个名字,这里笔者选择叫MainWindow,基类选择Qwidget。

最后,把对应的文件拖拽到对应的目录即可。

4. 在CMakeList.txt中添加头文件目录

由于我们修改了头文件的目录,所以CMake是无法自动寻找到Headers目录的,需要我们手动指定,在cmake中添加如下内容:

include_directories(
        ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/Sources/Headers
)

5. 修改mainwindow.cpp

此时我们直接编译会报错,所以需要自己修改一下mainwindow.cpp,将最上方头文件的引入的地址进行修改:

这里需要说明的是,QT会把UI文件预处理成对应的.h文件,然后在CPP文件中引用,生成的.h文件与UI文件同目录,所以我们想要引用的话需要正确设置文件的位置,正如上面所说一样,UI文件都在Forms目录下,所以我们引入的时候也需要指定Forms目录

这时候编译,就可以看到原来报错找不到定义或头文件的地方,都不会再报错了,因为编译过后,ui_MainWindow.h文件就会生成。

6. 修改main.cpp

然后我们将main.cpp修改为以下内容:

#include <QApplication>
#include "mainwindow.h"

int main (int argc, char *argv[])
{
  QApplication a (argc, argv);
  MainWindow w;
  w.show ();
  return QApplication::exec ();
}

编译运行,就能看到编译成功啦!

最后附上完成以后的CMakeList.txt

cmake_minimum_required(VERSION 3.22)
project(untitled1)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

#Set header location
include_directories(
        ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/Sources/Headers
        #${PROJECT_SOURCE_DIR}/Sources/Forms
)

#QT Location
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/gt_cross")

find_package(Qt5 COMPONENTS
        Core
        Gui
        Widgets
        REQUIRED)

#OpenCV Location
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/share/OpenCV")
find_package(OpenCV REQUIRED)
if(NOT OpenCV_FOUND)
    message(WARNING "OpenCV not found!")
else()
    #add head file
    include_directories(${OpenCV_INCLUDE_DIRS})
endif()

#add third party lib(if needed)
#link_directories(./lib)

add_executable(untitled1
        Sources/main.cpp
        Sources/mainwindow.cpp
        Sources/Headers/mainwindow.h
        Sources/Forms/mainwindow.ui)

#Link libraries
target_link_libraries(untitled1
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        )

target_link_libraries(untitled1 ${OpenCV_LIBS})


显示评论 (0)

文章评论

相关推荐

Yolov5_Seg输出解析

通过矩阵乘法(在代码中称为“matmul”)来计算分割掩码的原因,主要与实例分割网络(例如 YOLOv5 Segmentation)的实现方式有关。这种方法实际上是一种高效的特征图与目标分割系数组合的…

Ubuntu交叉编译Python

在 Ubuntu 上交叉编译 Python 的流程通常用于为不同平台生成可执行文件(如 ARM、MIPS 等)。以下是一般的操作步骤: 1. 安装必要的依赖工具 首先,确保已经安装了编译所需的工具和依…