当前位置: 首页 > news >正文

【vcpkg】cpprestsdk之64位编译链接及踩坑

▒ 目录 ▒

    • 🛫 问题
      • 描述
    • 1️⃣ 多版本vs报错
      • 指定VS路径
    • 2️⃣ error LNK2001: 问题排查
      • 通过IDA打开lib文件,确认导出内容
      • 查看源码
      • 增加参数--editable,重新编译
    • 3️⃣ error LNK2001: 外部符号`__imp_?close_...`
      • 去除`__imp_`
    • 🛬 结论
      • vcpkg卸载重载
      • 编译指定版本的源码(未验证)
      • 修改源码进行编译
    • 📖 参考资料

🛫 问题

描述

cpprestsdk之前编译过32位,已经踩了一些坑,本以为64位编译会顺风顺水,然而事与愿违,特此记录几个问题。
最终编译命令为vcpkg install cpprestsdk[websockets]:x64-windows-static --recurse --editable

1️⃣ 多版本vs报错

目标编译为2019,但是由于重装系统后,直接安装了2022的vs,导致没有了2019的x64 Native Tools Command Prompt for VS 2019环境,后又安装2019才解决问题。
在这里插入图片描述

指定VS路径

vs2019和2022共存的情况下,直接运行install命令,将报下面错误。
这个错误信息,一开始看的挺头晕,后来认真看了错误提示,发现vcpkg找到的路径是2022,但是它也给出了文档连接https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md#VCPKG_VISUAL_STUDIO_PATH,可以解决该问题。
在这里插入图片描述

小编以安装根目录J:\_ALL\CODE\vcpkg\vcpkg\x64-windows-static的编译目标为例,所以我们需要修改的文件是J:\_ALL\CODE\vcpkg\vcpkg\triplets\x64-windows-static.cmake。修改内容如下:

set(VCPKG_VISUAL_STUDIO_PATH "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community")
set(VCPKG_PLATFORM_TOOLSET v142)

2️⃣ error LNK2001: 问题排查

运行install命令,生成的lib进行集成的时候,提示未找到__imp_?close_pending_tasks_with_error@websocket_client_task_impl@details@client@websockets@web@@QEAAXAEBVwebsocket_exception@345@@Z(web::websockets::client::details::websocket_client_task_impl::close_pending_tasks_with_error)的错误。
各种搜索,没找到解决方案,只能编译链接原理通过一步步排查了

通过IDA打开lib文件,确认导出内容

通过删选关键字web::websockets::client::details::websocket_client_task_impl::,查看导出列表,的确没有导出函数close_pending_tasks_with_error
在这里插入图片描述

查看源码

搜索源码,定位到源码文件 J:\_ALL\CODE\vcpkg\vcpkg\buildtrees\cpprestsdk\src\ecb9e168c5-96a8d6ba89.clean\Release\src\websockets\client\ws_client.cpp
函数close_pending_tasks_with_error的编译条件是#if !defined(CPPREST_EXCLUDE_WEBSOCKETS),也就是说,当不定义CPPREST_EXCLUDE_WEBSOCKETS的时候就能将函数编译进去。

定位宏定义,最终在文件J:\_ALL\CODE\vcpkg\vcpkg\buildtrees\cpprestsdk\src\ecb9e168c5-96a8d6ba89.clean\Release\include\cpprest\details\basic_types.h中找到下面代码。

#if defined(_WIN32)
// Include on everything except Windows Desktop ARM, unless explicitly excluded.
#if !defined(CPPREST_EXCLUDE_WEBSOCKETS)
#if defined(WINAPI_FAMILY)
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && defined(_M_ARM)
#define CPPREST_EXCLUDE_WEBSOCKETS
#endif
#else
#if defined(_M_ARM)
#define CPPREST_EXCLUDE_WEBSOCKETS
#endif
#endif
#endif
#endif

不必管这些定义,在代码最后直接取消宏定义

#undef CPPREST_EXCLUDE_WEBSOCKETS

增加参数–editable,重新编译

--editable的含义是不清空代码,直接编译,最终命令为:
vcpkg install cpprestsdk[websockets]:x64-windows-static --recurse --editable
再次通过IDA查看导出函数,可以看到lib中已经有函数close_pending_tasks_with_error了。

ps: 貌似参数 --no-downloads也是可以的。

3️⃣ error LNK2001: 外部符号__imp_?close_...

去除__imp_

通过上面的操作,命名已经将函数编译到lib中了,为啥还是报错呢?想来想去只能是编译的类型不一样,通过BCompare工具,比较两个函数名,可以看出,需要的函数带__imp_
在这里插入图片描述

查资料,发现:如果函数声明增加了__declspec(dllimport) ,链接的时候函数名会加上__imp_前缀,所以如果链接静态库, 函数的声明不用增加__declspec(dllimport) 。如果链接动态库,再增加__declspec(dllimport)。
定位到函数声明,可以看到声明为_ASYNCRTIMP void close_pending_tasks_with_error(const websocket_exception& exc);,查看_ASYNCRTIMP的定义:
在这里插入图片描述

所以在项目中,增加_NO_ASYNCRTIMP即可。
也可以在引入cpprest头文件之前,定义_NO_ASYNCRTIMP宏,如下图所示:
在这里插入图片描述

🛬 结论

解决思路:

  • 确认lib中包含目标函数
  • 确保目标函数编译后的名字一模一样。

vcpkg卸载重载

开发过程中,经常要修改参数,重新编译库,已经安装的库无法重新安装,只能先卸载才能继续安装。
在这里插入图片描述

vcpkg remove cpprestsdk:x64-windows-static  --recurse

编译指定版本的源码(未验证)

通过命令.\vcpkg x-history cpprestsdk,查看cpprestsdk历史版本。
在这里插入图片描述

小编以安装根目录J:\_ALL\CODE\vcpkg\vcpkg\为例,所以我们需要修改的文件是J:\_ALL\CODE\vcpkg\vcpkg\ports\cpprestsdk\vcpkg.json。修改内容如下:
在这里插入图片描述

也就是指定字段version-semver
在这里插入图片描述

参考资料:

  • 随心所欲地对vcpkg依赖进行版本控制 https://zhuanlan.zhihu.com/p/352709760
  • https://learn.microsoft.com/zh-cn/vcpkg/users/versioning

修改源码进行编译

vcpkg install每次默认都将代码删除,然后再下载解压代码,所以直接修改代码会被清除。
执行命令中,增加参数--editable,将不再删除代码。命令如下所示:
vcpkg install cpprestsdk[websockets]:x64-windows-static --recurse --editable

📖 参考资料

  • 【vcpkg】cpprestsdk编译链接及实战 Chrome Devtool Protocol https://blog.csdn.net/kinghzking/article/details/125772160
  • vcpkg环境变量官方文档 https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md#VCPKG_VISUAL_STUDIO_PATH
  • VCPKG 环境变量 https://www.cnblogs.com/vcpkg/p/15019968.html
  • vcpkg版本说明: https://learn.microsoft.com/zh-cn/vcpkg/users/versioning

相关文章:

【vcpkg】cpprestsdk之64位编译链接及踩坑

▒ 目录 ▒🛫 问题描述1️⃣ 多版本vs报错指定VS路径2️⃣ error LNK2001: 问题排查通过IDA打开lib文件,确认导出内容查看源码增加参数--editable,重新编译3️⃣ error LNK2001: 外部符号__imp_?close_...去除__imp_🛬 结论vcpkg…...

初始QML

Qt Quick的介绍 : Qt Quick是QML的标准类型和功能库。它包括视觉类型,交互类型,动画,模型和视图,粒子效果和着色器效果。QML 应用程序开发人员可以通过单个导入语句访问所有这些功能,简单来说Qt Quick是一…...

SpringAOP切面实例实现对数据过滤返回,SpringAOP切面实现对用户权限控制,通过@Around注解过滤修改方法返回值

文章目录需求内容:实现:步骤一:导入SpringAOP相关依赖pom.xml步骤二:自定义两个注解步骤三:需要用到的实体类**步骤四:切面具体实现**用法1.需要过滤返回值的方法添加注解FilterByUser2.数据Dto在需要过滤的字段添加Fi…...

【Kubernetes】【九】Label,Deployment,Service

Label Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。 Label的特点: 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等一个资源对象可以定义任意数量的L…...

RuoYi-Vue部署(Nginx+Tomcat)

环境搭建RuoYi-Vue搭建、Linux安装Nginx、Linux安装JDK8、Linux安装MySql8、Linux安装Redis、Linux安装Tomcat9前端打包 1.ruoyi-ui鼠标右键-->打开于终端2.安装依赖:npm install --registryhttps://registry.npm.taobao.org-->node_modules3.编译打包&#x…...

Hive提升篇-Hive修改事务

简介 Hive 默认是不允许数据更新操作的,毕竟它不擅长,即使在0.14版本后,做一些额外的配置便可开启Hive数据更新操作。而在海量数据场景下做update、delete之类的行级数据操作时,效率并不如意。 简单使用 修改HIVE_HOME/conf/hi…...

PMP项目管理未来的发展与趋势

什么是项目管理?关于项目管理的解释主要是基于国际项目管理三大体系不同的解释及本领域权威专家的解释。 项目管理就是以项目为对象的系统管理方法,通过一个临时性的、专门的柔性组织,对项目进行高效率的计划、组织、指导和控制,以…...

深度学习算法面试常问问题(三)

pooling层是如何进行反向传播的? average pooling: 在前向传播中,就是把一个patch的值取平均传递给下一层的一个像素。因此,在反向传播中,就是把某个像素的值平均分成n份 分配给上一层。 max pooling: 在前…...

GEE学习笔记 八十七:python版GEE动态加载地图方法

在Google Earth Engine的python版API更新后,之前使用folium动态加载地图的代码就不能在正常运行,因为整个Google Earth Engine的地图加载服务的URL发生了更新,所以我们也需要更新相关绘制方法。下面我会讲解一种新的绘制方法,大家…...

第三章 SQL错误信息

文章目录第三章 SQL错误信息SQLCODE 0和100SQLCODE -400检索SQL消息文本第三章 SQL错误信息 下表列出了SQL数字错误代码及其错误消息。这些代码作为SQLCODE变量值返回。 注意:虽然本文档将错误代码列为负值,但JDBC和ODBC客户端始终收到正值。例如&…...

axios中的resolvePromise为什么影响promise状态

axios的取消请求意思很简单,就是在发送请求后不久停止发送请求 本文探讨的是v0.22.0之前的CancelToken API,因为在阅读源码交流的时候发现很多朋友不理解为什么CancelToken中的resolvePromise会影响到实例对象身上的promise状态 即下图所示代码&#xf…...

AWS攻略——创建VPC

文章目录创建一个可以外网访问的VPCCIDR主路由表DestinationTarget主网络ACL入站规则出站规则子网创建EC2测试连接创建互联网网关(IGW)编辑路由表知识点参考资料在 《AWS攻略——VPC初识》一文中,我们在AWS默认的VPC下部署了一台可以SSH访问的…...

一文搞懂ECU休眠唤醒之利器-TJA1145

前言 首先,小T请教大家几个小小问题,你清楚: 什么是TJA1145吗?你知道休眠唤醒控制基本逻辑是怎么样的吗?TJA1145又是如何控制ECU进行休眠唤醒的呢?使用TJA1145时有哪些注意事项呢? 今天&…...

【Java基础】022 -- Lambda与递归练习

目录 一、Lambda表达式 1、Lambda初体验 2、函数式编程 3、Lambda表达式的标准格式 4、小结 5、Lambda表达式的省略写法 ①、示例代码 ②、小结 6、Lambda表达式的练习 ①、Lambda表达式简化Comparator接口的匿名形式 二、综合练习 1、按照要求进行排序&#xff08…...

技研智联云原生容器化平台实践

作者简介:郑建林,现任深圳市技研智联科技有限公司架构师,技术负责人。多年物联网及金融行业经验,对云计算、区块链、大数据等领域有较深入研究及应用。现主要从事 PaaS 平台建设,为公司各业务产品线提供平台底座如技术…...

订单服务:订单流程

订单流程 订单流程是指从订单产生到完成整个流转的过程,从而行程了一套标准流程规则。而不同的产品类型或业务类型在系统中的流程会千差万别,比如上面提到的线上实物订单和虚拟订单的流程,线上实物订单与 O2O 订单等,所以需要根据…...

Python的有用知识,一共十三个代码片段,确定不来看看吗

前言 之前发过22个小技巧,今天就来分享分享13个非常有用的代码片段 赶紧码住,看看你都了解吗 1.将两个列表合并成一个字典 假设我们在 Python 中有两个列表,我们希望将它们合并为字典形式,其中一个列表的项作为字典的键&#…...

数据结构与算法-数组

前言:几乎所有的编程语言都原生支持数组类型。因为数组是最简单的内存数据结构。创建一个数组:let arr new Array()或let arr new Array(5) // 指定长度或let arr new Array(1,2,3,4,5) // 将数组元素作为参数传给构造函数或let arr [1,2,3,4,5] // …...

PMP证书在哪个行业比较有用?

PMP 各个行业都能用,PMP 的知识体系是通用的,管理层的考试也有借鉴PMP知识的地方。历年考生考的最多的是IT 行业,其他行业也都有分布。PMP认证从国外引进大陆这么多年了,其火热程度依然不减,我个人认为是取决于市场的运…...

Wine零知识学习4 —— Wine编译进阶详解

本系列第3篇文章Wine零知识学习3 —— Winetricks介绍及下载和运行讲述了Wentricks的下载及使用。在Winetricks的使用过程中会发现很多应用下载会出现问题,会提示32位程序无法运行在64位系统上。为什么会出现这个问题?又如何解决此问题?这就是…...

通过 curl 命令快速测试 Taotoken 大模型接口连通性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 curl 命令快速测试 Taotoken 大模型接口连通性 在接入大模型服务时,直接使用 curl 命令进行接口测试是一种高效且…...

别再搞混了!设备上那个RJ45口是Console调试口,不是网口(附电路设计详解)

别再搞混了!设备上那个RJ45口是Console调试口,不是网口(附电路设计详解) 第一次接触企业级网络设备时,许多新手都会犯一个经典错误——把设备背面那个看似网口的RJ45接口当作普通网络接口使用。我曾亲眼见过一位实习生…...

基于 SOFAJRaft + Spring Boot 构建高可用 KV 存储集群(完整源码)

基于 SOFAJRaft + Spring Boot 构建高可用 KV 存储集群(完整源码) 引言 在分布式系统中,一致性 是核心难题。Raft 是比 Paxos 更易于理解的共识算法,而 SOFAJRaft 是蚂蚁集团开源的 Java 高性能 Raft 实现。 本文带你从零构建一个 3 节点高可用 KV 存储集群,包含完整源码、…...

eLabFTW:开源电子实验笔记本如何重塑科研数据管理流程

eLabFTW:开源电子实验笔记本如何重塑科研数据管理流程 【免费下载链接】elabftw :notebook: eLabFTW is the most popular open source electronic lab notebook for research labs. 项目地址: https://gitcode.com/gh_mirrors/el/elabftw 在数字化科研时代&…...

如何5分钟部署AI斗地主助手:从零开始打造你的智能游戏伙伴

如何5分钟部署AI斗地主助手:从零开始打造你的智能游戏伙伴 【免费下载链接】DouZero_For_HappyDouDiZhu 基于DouZero定制AI实战欢乐斗地主 项目地址: https://gitcode.com/gh_mirrors/do/DouZero_For_HappyDouDiZhu 还在为斗地主游戏中的决策烦恼吗&#xff…...

2025终极指南:如何用PyGlossary打破词典格式壁垒

2025终极指南:如何用PyGlossary打破词典格式壁垒 【免费下载链接】pyglossary A tool for converting dictionary files aka glossaries. Mainly to help use our offline glossaries in any Open Source dictionary we like on any operating system / device. 项…...

避坑指南:DolphinScheduler Docker部署后,MySQL数据源连不上的几种常见原因及排查

DolphinScheduler Docker部署MySQL数据源连接问题深度排查手册 当你兴冲冲地部署完DolphinScheduler的Docker版本,准备配置MySQL数据源时,突然遭遇"连接失败"的红色警告——这种挫败感我太熟悉了。去年我们团队迁移数据平台时就连续踩了三个坑…...

如何快速搞定GTNH中文汉化:新手友好的终极指南

如何快速搞定GTNH中文汉化:新手友好的终极指南 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH 还在为GTNH(GregTech: New Horizons)这个顶级整合包的全英文…...

手把手教你用Simulink搭建带Resolver的永磁同步电机FOC仿真模型(从电机库到代码生成)

从零构建永磁同步电机FOC仿真:集成旋变解码与代码生成的完整实践指南 在电机控制领域,快速验证算法并实现从仿真到硬件的无缝过渡是工程师面临的核心挑战。本文将带您完成一个包含旋转变压器(Resolver)信号处理的完整永磁同步电机…...

Logback彩色日志进阶玩法:自定义颜色规则、区分环境开关,以及文件日志的‘去色’指南

Logback彩色日志进阶实战:从炫彩控制台到严谨生产环境的全链路配置 在软件开发的生命周期中,日志是我们最忠实的伙伴。想象一下深夜调试时,满屏灰白的日志中突然跳出一行醒目的红色ERROR信息——这就是彩色日志赋予我们的"视觉直觉"…...