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 库为例,测试程序很简单,下面是代码。
#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_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。输出如下:
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 中。
add_executable(untitled5
main.cpp
vcpkg.json
)
打开 vcpkg.json,可以添加其他的库。
这里又有个 bug,用这种方法添加的库没法保存到文件中。所以我们需要自己复制,更新到 vcpkg.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)。大家可以自己去找找。
剩下的用法就差不多了。
这两种方法我觉得还是第一种更简单方便一些。所以,对于个人业余开发者来说,建议使用第一种方案。