关键词:Ubuntu,ARM,QT,OpenCV,交叉编译
关于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
下,Forms
和Headers
分别存放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})
文章评论