Qt Creator 中使用 vcpkg

Qt Creator 中使用 vcpkg

Qt Creator 是一个跨平台的轻量级 IDE,做 Qt 程序开发的同学们肯定对这个 IDE 都比较属于。这个 IDE 虽然没有 Visual Stdio 功能那么强,但是由于和 Qt 集成的比较深,用来开发 Qt 程序还是很顺手的。

早期,开发 Qt 程序都是用 qmake 来写项目文件,但是随着 cmake 的成熟,Qt 开发也慢慢转向 cmake。在 Qt 5 的时代,cmake 来写 Qt 的项目文件还是有蛮多问题的。但是 Qt 6 基本上把这些问题都解决了。

vcpkg 是一个跨平台的 C/C++ 包管理器。解决了 C/C++ 生态中没有包管理器这个最大的痛点。

这篇博客就讲一讲 Qt Creator 中开发 C/C++ 程序时如何使用 vcpkg 的各种包的问题。

如果你还是用 qmake 来写项目文件,那么就直接添加库就行了,有没有 vcpkg 没有什么影响。 如果你已经在使用 cmake,那么厦门的内容会对你有用。

编程环境介绍

我的电脑是 win 11,装的编译器是 Visual Stdio 2022。Qt Creator 版本是 15.0.0。 Qt 版本是 6.8.1。

因此下面的描述都是在这个环境下测试的。

我们以 gsl 库为例,测试程序很简单,下面是代码。

C++ 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <gsl/gsl_sf_bessel.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << gsl_sf_bessel_I0(0.5);
    return a.exec();
}

整个程序的作用就是 计算 bessel 函数在 0.5 处的函数值。计算这个值只不过是为了确保使用到 gsl 这个库。

CMakeLists.txt 文件如下:

cmake 复制代码
cmake_minimum_required(VERSION 3.16)

project(untitled5 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

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

add_executable(untitled5
  main.cpp
)
target_link_libraries(untitled5 Qt${QT_VERSION_MAJOR}::Core GSL::gsl GSL::gslcblas)

include(GNUInstallDirs)
install(TARGETS untitled5
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

上面的代码很简单,但是如果 Qt Creator 不做任何设置的话会直接报错。报错的内容就是找不到 GSL 这个库。

方式一(传统用法)

先介绍一种最简单的方法。这个方法要求 vcpkg 里面已经编译好了这个库。所有的项目公用同一组编译好的库。

在 Qt Creator 里项目-> Inital Configuration 里面加入 CMAKE_TOOLCHAIN_FILE 的值。

这里需要特别注意的是 Debug 和 Release 都需要输入一遍。如果不知道 CMAKE_TOOLCHAIN_FILE 的值该写什么,可以执行 vcpkg integrate install。输出如下:

shell 复制代码
D:\vcpkg>vcpkg integrate install
Applied user-wide integration for this vcpkg root.
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake"

All MSBuild C++ projects can now #include any installed libraries. Linking will be handled automatically. Installing new libraries will make them instantly available.

这样设置完后直接在 Qt Creator 中执行 CMake 也还是不行的。需要先 Clear CMake Configuration ,然后再 CMake ,之后就可以正常编译运行了。

这种方式最简单,但是也有个致命的缺点。如果两个项目都使用到同一个库,但是这库编译时的配置参数不同,就不能用这种方法了。因为 vcpkg 没法同时存在一个库的两种不同配置。

方式二(vcpkg.json)

首先,要在 Qt Creator 中使能 vcpkg plugin。

这样就可以设置 vcpkg 的位置了。

之后就可以在项目中添加一个 vcpkg.json 文件了。

Qt Creator 有个 bug, 这样添加会报错:

没关系,我们自己把 vcpkg.json 文件加入到 CMakeLists.txt 中。

cmake 复制代码
add_executable(untitled5
  main.cpp
  vcpkg.json
)

打开 vcpkg.json,可以添加其他的库。

这里又有个 bug,用这种方法添加的库没法保存到文件中。所以我们需要自己复制,更新到 vcpkg.json 文件中。

下面的文件引入了两个库,之后就开始自动的下载源码,开始编译,要等好久。

json 复制代码
{
    "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
    "dependencies": [
        {"name":"gsl"},
        {"name":"opencv4", "features": ["jpeg"]}
    ],
    "name": "mypackage",
    "version-string": "0.0.1"
}

编译好的文件在build 目录中(vcpkg_installed)。大家可以自己去找找。

剩下的用法就差不多了。

这两种方法我觉得还是第一种更简单方便一些。所以,对于个人业余开发者来说,建议使用第一种方案。

相关推荐
范特西.i5 天前
QT聊天项目(8)
开发语言·qt
枫叶丹45 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
十五年专注C++开发5 天前
Qt deleteLater作用及源码分析
开发语言·c++·qt·qobject
kangzerun5 天前
SQLiteManager:一个优雅的Qt SQLite数据库操作类
数据库·qt·sqlite
金刚狼885 天前
qt和qt creator的下载安装
开发语言·qt
追烽少年x5 天前
Qt中使用Zint库显示二维码
qt
谁刺我心5 天前
qt源码、qt在线安装器镜像下载
开发语言·qt
金刚狼885 天前
在qt creator中创建helloworld程序并构建
开发语言·qt
扶尔魔ocy6 天前
【转载】QT使用linuxdeployqt打包
开发语言·qt
YxVoyager6 天前
在VS2017中使用Qt的foreach宏,IntelliSense无法正确识别函数定义
c++·qt