65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 pkg-config 工具修复的 C++ CMake 构建 SQLite3 问题

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024 年 7 月 18 日

CPOL

2分钟阅读

viewsIcon

247223

修复已发布。三周前,当我尝试在 CMake 脚本中使用 find_package( SQLite3 REQUIRED ) 时,它失败并输出了一个错误。以下是我解决这个问题的方法。

修复已发布

三周前,当我尝试在 CMake 脚本中使用 find_package( SQLite3 REQUIRED ) 时,它失败并输出了一个错误。find_package 始终是解决依赖项并编写可移植构建脚本的好帮手,这要归功于那些抽象和自动化配置和版本控制的贡献者。虽然熟悉这种情况,但我有点懒,并且对在实用程序失败时编写手动配置感到恼火。

在寻找解决 SQLite3 的 find_package 问题的方案时,我发现互联网上很多人建议不同的方法,但大多数方法对我不起作用。然后,我对这个困惑的根源产生了兴趣。

当我访问 GitHub 仓库 Kitware/CMake 下的脚本 FindSQLite3.cmake 时,我注意到它与我环境中 CMake 3.29.6 版本中看到的脚本不同。幸运或不幸的是,它自 2024 年 3 月起已经修复,但仍等待下一个发布版本。现在,3.30.0 上周发布了此修复。让我们升级 CMake,享受使用 SQLite3 构建 C++ 代码的便利性。

脚本中的修复看起来很简单:使用 PkgConfig 包中的 pkg_check_modules 命令。它调用 pkg-config 工具来获取编译器所需的信息,并将其在 CMake 脚本中作为变量提供。请查看您可以在 CMake 文档这里 获取哪些变量。

即使您现在无法升级 CMake,但已经安装或可以安装 pkg-config,您也可以通过在 CMake 脚本中包含以下小脚本来解决该问题。这是我目前使用的解决方案。

find_package(PkgConfig)
pkg_check_modules(PC_SQLite3 sqlite3)
set( SQLite3_ROOT "${PC_SQLite3_PREFIX}" )

pkg-config 非常有用

由于 pkg-config 是一个命令行工具,我开始想知道它如何改变 C++ 代码在命令行上的编译方式。因此,我尝试使用 我上一篇文章 中的代码。

# install pkg-config
apt-get install pkg-config
# install sqlite3 libraries
apt-get install libsqlite3-dev
# compile the code setting up compile options by pkg-config
g++ --std=c++14 -I./include ./main-2.cpp ./src/SmartDbConnFactory.cpp $(pkg-config --libs --cflags sqlite3)

编译成功,构建的可执行文件可以正常工作!

但是,执行 pkg-config --libs --cflags sqlite3,我只得到 -lsqlite3。我无法感受到这个工具的力量。

所以,我也尝试使用 OpenCV。这次,该命令返回了一个很长的列表。这将会很有趣。

-I/usr/include/opencv4 -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core

让我们使用一个简单的 OpenCV 代码。这个程序会将一个图像文件转换为灰度图像。

// main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
	cv::Mat image = cv::imread("example.jpg");
	cv::Mat grayImage;
	cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
	cv::imwrite("example_gray.jpg", grayImage);
	return 0;
}

现在,使用 pkg-config 工具编译它。

# install OpenCV libraries and dependencies
apt-get install libopencv-dev
# compile the code setting up compile options by pkg-config
g++ --std=c++14 main.cpp $(pkg-config --libs --cflags opencv4)

编译成功,图像文件转换可以正常工作!我对这个结果感到兴奋。它将使我的编码生活更轻松。

© . All rights reserved.