CMake+MinGW+vcpkg项目引入三方库的两种方式(手动路径,vcpkg)

news/2025/11/16 14:28:13/文章来源:https://www.cnblogs.com/Tracker647/p/19228110

搬运自自己的CSDN博客:https://blog.csdn.net/Tracker647/article/details/142070768
原帖日期2024年9月9日。

接到个新项目,用到很多三方库,从对接的同事那了解到vcpkg这个工具,周末试用了下,确实很方便,以前需要自己动手的源码下载,编译和打包安装,如今一个vcpkg install就能一站解决,十分便利,vcpkg的构建系统包含CMake,自己在用vcpkg搭建项目的时候遇到了些问题,一时搜索无法解决,最后回去补了些CMake的基础,再回来用vcpkg,才终于走顺,这里把实验的过程特此记录。

用的项目例子为Helloworld程序引用fmt库,测试环境Windows10, 目录结构如下:

PS D:\CodeDraft\helloworld> tree /F
卷 开发 的文件夹 PATH 列表
卷序列号为 BE68-723D
D:.
│  CMakeLists.txt
│  main.cpp
│  run_cmake.ps1
│
├─3rdparty
│  └─fmt_x64-mingw-dynamic
│      │  BUILD_INFO
│      │  CONTROL
│      │
│      ├─bin
│      │      libfmt.dll
│      │
│      ├─debug
│      │  ├─bin
│      │  │      libfmtd.dll
│      │  │
│      │  └─lib
│      │      │  libfmtd.dll.a
│      │      │
│      │      └─pkgconfig
│      │              fmt.pc
│      │
│      ├─include
│      │  └─fmt  

vcpkg的下载过程可参考:https://www.cnblogs.com/linuxAndMcu/p/14696542.html

建项目过程,首先新建个helloworld文件夹

mkdir helloworld
cd helloworld

然后main.cpp如下

#include <fmt/core.h>
int main()
{fmt::print("Hello World!\n");return 0;
}

手动路径

用vcpkg将fmt库下载好之后直接CV到helloworld项目的3rdparty中,vcpkg install的包一般安装在vcpkg安装目录的packages文件夹中。

vcpkg install fmt:x64-mingw-dynamic

注意triplet参数,Windows上默认用x64-windows, 我习惯用mingw,注意x64-windows是msvc编译器,跟mingw的程序不兼容。

vcpkg又分动态库和静态库版本,一般使用动态库,我选的是x64-mingw-dynamic,即mingw的动态版本。

有了库和main.cpp, 可以编写CMakeLists.txt了:

cmake_minimum_required(VERSION 3.10)project(HelloWorld)
message("CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")include_directories(${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/include)
link_directories(${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/bin)    # -Lpath
link_libraries(fmt) #-lfmt
add_executable(HelloWorld main.cpp)add_custom_command(TARGET HelloWorld POST_BUILD     #-for copy libs in windowsCOMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/bin/libfmt.dll ${CMAKE_SOURCE_DIR}/build)

build然后run, 这里我用的ps脚本,后面发现CMakePresets.json也有类似的功能,后面vcpkg方式用的就是CMakePresets.json。

cmake -G "MinGW Makefiles" -B build
cd build
make
.\HelloWorld.exe
cd ..

windows上执行项目相比Ubuntu上有一个坑点,exe文件运行必须依赖同一目录下的dll,在powershell上表现为执行.\HelloWorld.exe无响应,在资源管理器双击运行才会报错说明缺少了什么库。这里我用add_custom_command命令自动把对应的dll文件给拷贝进去。

自此项目编译运行就完成了,优点简单易懂,缺点就是不适合三方库多,结构复杂的项目。

Vcpkg自动方式

照着微软官方的教程做就行,不过官方用的msvc, MinGW需要对CMakePreset.json做点修改,这里放出来:

{"version": 2,"configurePresets": [{"name": "default","generator": "MinGW Makefiles","binaryDir": "${sourceDir}/build","cacheVariables": {"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake","VCPKG_TARGET_TRIPLET" : "x64-mingw-dynamic","CMAKE_BUILD_TYPE": "Debug"}}]}

可以看到需要指明generatorVCPKG_TARGET_TRIPLETCMAKE_BUILD_TYPE, 告诉CMake,根据MinGW的生成方式,下载vcpkg.json依赖库的x64-mingw-dynamic版本,以Debug的构建类型调用。

vcpkg的方式也可以自动将dll库引入。

小踩坑

手动引入方式,在网上搜索如何拷贝dll库时,用过这么一个引入三方库的写法:

cmake_minimum_required(VERSION 3.10)project(HelloWorld)
message("CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
message("VCPKG_ROOT: $ENV{VCPKG_ROOT}")add_executable(HelloWorld main.cpp)add_library(fmt SHARED IMPORTED)
set_property(TARGET fmt PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/bin/libfmt.dll)target_include_directories(fmt INTERFACE ${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/include)target_link_libraries(HelloWorld fmt)

结果不知为何,CMake居然找不到dll库了!几个小时搜索仍旧未见效果,最后只好stackoverflow上问,才知道原来又是windows基础的锅,编译用lib运行用dll,要补全set_property, 不知道为什么用link_directorieslink_libraries就过了。

add_library(fmt SHARED IMPORTED)
set_property(TARGET fmt PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/bin/libfmt.dll)
set_property(TARGET fmt PROPERTY IMPORTED_IMPLIB ${CMAKE_SOURCE_DIR}/3rdparty/fmt_x64-mingw-dynamic/lib/libfmt.lib) #应补上

fmt的x64-mingw-dynamic版本只提供了dll,没有提供lib,好在MinGW提供了生成的工具:

gendef.exe libfmt.dll
dlltool.exe -d libfmt.def -l libfmt.lib

把libfmt.lib拷贝到指定目录,重新编译,通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring AI Alibaba 项目源码学习(八)-Flow Agent 分析

Flow Agent 分析 请关注微信公众号:阿呆-bot 概述 本文档分析 Spring AI Alibaba Agent Framework 中的 Flow Agent 系列,包括 FlowAgent 基类、SequentialAgent、ParallelAgent、LoopAgent 和 LlmRoutingAgent 的具…

Why did Hitler become a greater Napoleon?

Because Napoleon never attached any meanings to the cross or inborn ability.

vcpkg交叉编译

搬运自自己的CSDN博客:https://blog.csdn.net/Tracker647/article/details/149149713 原帖日期2025年7月6日。 前言 维护的一个项目,由于特殊的技术原因,需要横跨Windows, Linux, ARMLinux三个平台去维护,因此每次…

详细介绍:什么是机械设备制造ERP?哲霖软件如何助力企业实现降本增效?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python -m pip install 就行 我pip install就不行?

python -m pip install 就行 我pip install就不行?离奇现象 直接输入pip相关命令用不了,返回如下信息: Fatal error in launcher: Unable to create process using "C:\Users\86178\AppData\Local\Programs\Py…

Personalized QRCode - 个性化自定义二维码生成器

Personalized QRCode - 个性化自定义二维码生成器. 个性化二维码生成器 使用您自己的图片创建独特的个性化二维码 几秒钟内生成美观的个性化二维码。 上传您的图片,自定义您的二维码,与世界分享。 https://qrcode.ch…

对“机器人VCU”进行一个详细、架构的讲解。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Qt编写28181推流分发服务/统计访问数量/无人观看超时关闭/等待重新点播/复用点播

一、前言说明 本以为之前写的国标GB28181服务端程序已经够完善了,不料又来个新的需求,需要配合流媒体服务程序进行处理,本着给钱就干的原则,把mediamtx和zlm的http请求接口研究了下,需求主要两个,一个是需要统计…

20232407 2025-2026-1 《网络与系统攻防技术》 实验五实验报告

1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取信息 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置 (3)使用nmap开源软件…

实现string类

#pragma once#include <cstddef> #include <cstring> #include <algorithm> #include <stdexcept>// namespace M { class string { public:static const size_t s_min_capacity; private:cha…

实用指南:Vue 实例生命周期

实用指南:Vue 实例生命周期2025-11-16 14:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

React Native创建AndroidIOS流程完整指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ducky - BPMN 工作流管理系统

Ducky - BPMN 工作流管理系统 https://github.com/fanqingsong/ducky/tree/main 一个基于 FastAPI 和 SpiffWorkflow 的 BPMN 2.0 工作流管理系统,提供完整的流程定义管理、实例执行和可视化功能。功能特性核心功能✅…

图论建模问题

本文将不定期更新图论建模 行列二分图 给一个二维平面,建立二分图,左部点编号为横坐标,右部点编号为纵坐标,平面上一个点即为二分图上一条边。 CF1140F Extending Set of Points 建立行列二分图,把每一个点看成一…

python多进程通信中的Queue、SimpleQueue、Pipe

python多进程通信中的Queue、SimpleQueue、Pipepython多进程通信中的Queue、SimpleQueue、Pipepython多进程通信中的Queue、SimpleQueue、PipeQueue 多进程中的Queue的底层是使用Pipe实现的,因此使用Queue进行多进程通…

旧版本SiK数传的对频问题

最近折腾 3DR数传,芯片是 USB HM‑TRP ,地面端固件是 SiK 1.7,天空端是 2.2,无法连接。用 Mission Planner 看了下,地面端的 格式(FORMAT) 是 25,天空端是 26,不兼容。 尝试用 MP 给地面端刷固件,点了加载固…

2025年甘肃广告策划服务综合推荐排行榜

摘要 随着数字化转型加速,2025年甘肃广告策划行业迎来新一轮发展机遇,本土服务商在创意能力、技术应用和服务体系方面持续升级。本文基于市场调研、客户反馈和行业数据,为您呈现甘肃地区广告策划服务商综合实力排行…

2025年甘肃兰州专业的广告物料制作公司推荐

摘要 随着数字化转型的加速和线下体验经济的崛起,2025年甘肃兰州广告物料制作行业迎来新一轮发展机遇。本地市场需求持续增长,对创意设计、工艺质量和一站式服务的要求显著提升。本文基于行业数据、客户口碑和技术实…

2025年甘肃兰州比较好的广告物料制作服务团队

摘要 2025年,甘肃兰州广告物料制作行业持续蓬勃发展,随着数字化和个性化需求增长,本地服务商在技术、创意和执行层面不断升级。本文基于行业数据和用户口碑,为您推荐排名前十的广告物料制作服务团队,并提供详细分…

wordpress批量删除文章

wordpress批量删除文章批量删除文章,比如要删除分类ID为24993下面的文章delete from wp_posts using wp_posts,wp_term_relationships,wp_term_taxonomywherewp_posts.id=wp_term_relationships.object_idandwp_term_r…