1+1=10

记记笔记,放松一下...

如何在Qt Creator下优雅地配置第三方库

C++下使用各种三方库是不可避免的,如果不借助任何包管理工具,在QtCreator下,如何玩转三方库...

考虑如下一个极度简化的使用第三方库的场景:

  • 电脑上有多套Qt:Qt5.15,Qt6.8,...
  • 同时安装了多套OpenCV:OpenCV4.0,OpenCV4.10,...

应该如何配置,才能隐藏这些细节。使得在同一个项目文件(.pro 或 CMakeLists.txt)中,不写死任何路径, 又可以随意切换,

比如:在同一个QtCreator下,在如下配置下自由切换:

  • Qt5.15 + OpenCV4.0
  • Qt5.15 + OpenCV4.10
  • Qt6.8 + OpenCV4.0
  • Qt6.8 + OpenCV4.10
  • ...

其实,很简单

只需要充分利用Qt Creator的Kits功能,克隆(copy)出来不同的配置,做些微调就行了。效果如下:

qtcreator-kits-config

那么需要调整什么?

需要做什么?

两件事:

  • 让cmake能找到三方库(OpenCVConfig.cmake
  • 让qmake能找到三方库(opencv.prf

我们以 Windows 下 Qt6.8 + OpenCV4.0 配置为例

克隆Qt默认配置

克隆 Desktop Qt 6.8.0 MSVC2022 64bit 配置文件,名字改为自己喜欢的以便于区分:

1
Qt %{Qt:Version} MSVC2022 64bit(OpenCV 4.0.1)

确定 OpenCV 位置

假定OpenCV位于 D:/Qt/opencv-4.0.1-vs2015-x64/,那么

需要确认:OpenCVConfig.cmake 在哪个具体位置,比如

1
D:/Qt/opencv-4.0.1-vs2015-x64/x64/vc14/lib

让 cmake 找到三方库

要让 cmake的 find_package() 能找到所需要的库,它有一套复杂的 查找规则。 可以通过各种环境变量(比如CMAKE_PREFIX_PATH)或者cmake变量(比如 <PackageName>_ROOT<PackageName>_DIR) 进行控制。

我们继续考虑简单的场景,在命令行下,只需要将如下选项传递给cmake即可:

1
-DOpenCV_DIR:PATH=D:/Qt/opencv-4.0.1-vs2015-x64/x64/vc14/lib

问题转化成,如何在Qt Creator下实现同样效果?

在 Kits 配置中,将上述内容加入 CMake Configuration 即可。

让 qmake 找到第三方库

尽管早已不建议继续使用 qmake,为了完整性,此处仍给出个人早期常用方案。

首先,为每一个opencv的库,准备一个 opencv.prf 文件,内容大致如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
INCLUDEPATH += D:/Qt/opencv_build_vs2015_x64/include
LIBS += -LD:/Qt/opencv_build_vs2015_x64/x64/vc14/lib
CONFIG(debug, debug|release) {
    LIBS += -lopencv_aruco310d
    LIBS += -lopencv_bgsegm310d
    #...
} else {
    LIBS += -lopencv_aruco310
    LIBS += -lopencv_bgsegm310
    #...
}

而后,通过如下环境变量告诉 qmake 它在什么地方

1
QMAKEFEATURES=D:\Qt\opencv-4.0.1-vs2015-x64\qtfeatures

在Qt Creator下,在 Kits 配置中,将上述内容加入 Environment 即可。

重复操作

重复如上操作,即可完成不同 kits 的配置

最终配置结果,会放在如下文件中:

1
%appdata%/QtProject/qtcreator/profiles.xml

使用

Kits环境配置完毕后,所有细节对各个项目都是隐藏的:

cmake 项目

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cmake_minimum_required(VERSION 3.16)

project(hello112 LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)
find_package(OpenCV REQUIRED )

add_executable(hello112  main.cpp)
target_link_libraries(hello112 Qt::Core ${OpenCV_LIBS})

qmake 项目

.pro 文件只需要如下这样

1
2
3
4
win32:CONFIG += opencv

SOURCES += \
        main.cpp

参考

  • https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure
  • https://discourse.cmake.org/t/packagename-root-vs-package-dir/10361/3
  • https://doc.qt.io/qt-6/qmake-advanced-usage.html

Qt