QT使用腾讯云对象存储SDK报错:`undefined reference to qcloud_cos`

QT使用腾讯云对象存储SDK编译时报错:undefined reference to qcloud_cos

文章目录

  • QT使用腾讯云对象存储SDK编译时报错:`undefined reference to qcloud_cos`
    • 问题1:在VS中编译cossdk报错`LNK1104 无法打开文件“PocoFoundationd.lib”`
    • 问题2:在QT中引入头文件编译报错: `fatal error: cos_api.h: No such file or directory`
    • 问题3:qt编译报错`undefined reference to qcloud_cos...`
      • 问题 3.1 下载poco源代码编译未生成`PocoCrypto.lib、PocoNetSSL.lib`
      • 问题3.2 解决qt报错`undefined reference to qcloud_cos...`
      • 问题3.3 QT安装了MSVC2017却无法使用
    • 问题4: 编译过程中大量报错`C2065、C2614、未声明标识符`等。
    • 问题5:编译成功,执行闪退。

前情提要:因为需要在qt中开发云存储项目,所以使用了腾讯云SDK,没想到问题百出,记录一下过程中遇到的问题。

我的环境是:

  • window11

  • cmake version 3.29.3

  • Visual Studio2022

  • QMake version 3.1

  • qt 5.12.10

如果有帮到您的话,请点个赞哦~

问题1:在VS中编译cossdk报错LNK1104 无法打开文件“PocoFoundationd.lib”

image-20240805130822536

报错样例
  • 解决办法:官方下载的sdk只允许进行Release 编译,记得更改。同样的,在QT中使用该SDK也只允许release构建/运行。

image-20240805130836262

Tips: 如果需要debug的话,请按照官方文档重新配置:Windows Debug 版本编译指南 。这个我目前还没试过,估计也是很坑

问题2:在QT中引入头文件编译报错: fatal error: cos_api.h: No such file or directory

解决办法:

  1. 将编译好的cossdk下的include、libs、third_party三个目录移动到工程目录下,并且将编译好的cossdk.lib放到libs目录下

image-20240805131412198

image-20240805131557251

  1. 在qt项目中右键“添加库”,导入库文件和头文件目录,这里会自动添加cossdk的include,此外还要额外添加third_party下面的include目录

在这里插入图片描述

INCLUDEPATH += $$PWD/third/cos/include \$$PWD/third/cos/third_party/include	 # 额外手动添加的
DEPENDPATH += $$PWD/third/cos/include \$$PWD/third/cos/third_party/include		# 额外添加的

Tips: 如果后续提示找不到Poco库(如报错:C1083:无法打开包括文件:“Poco/JSON/…”)也可以用同样的方式导入头文件和库

问题3:qt编译报错undefined reference to qcloud_cos...

image-20240805132142169

真正的重头戏来了,遇到这个问题的同学请注意!

请看官方文档:C++ SDK 常见问题

在这里插入图片描述

官方文档上说:这种情况一般是因为工程自带的 libcossdk.a 编译使用的 gcc 版本与客户机器上的 gcc 版本不一致导致的,需要客户重新编译 poco 库和 libcossdk。

实际上我并没有按照他给出的方法解决问题,我从openssl开始编译,然后编译poco文件,然后编译cossdk,最后放到qt上依然会报错。

因为大家不一定和我的问题是同一个问题,所以我会在本节记录一下我编译过程中遇到的问题,给选择编译路线的小伙伴一些提示。在之后我会给出我真正解决问题的方法。

问题 3.1 下载poco源代码编译未生成PocoCrypto.lib、PocoNetSSL.lib

网络上编译Poco的教程很多,不作详细介绍,简单步骤为:

  • 下载源码
  • 创建cmake-build文件,在该目录下执行cmake命令
  • 用VS打开生成的.sln工程生成解决方案。

在这个过程中可能会遇到没有生成PocoCrypto.lib、PocoNetSSL.lib的情况。(cmake的日志中没有显示:-- Building: NetSSL_OpenSSL -- Building: Crypto

这是因为系统中没有openssl,需要先安装openssl配置在环境中。

配置openssl还没有生成的话,可以在cmake命令中强行指定

# 简单版本  D:\OpenSSL-Win64为你的openssl安装目录
cmake .. -DOPENSSL_ROOT_DIR=D:\OpenSSL-Win64 -DENABLE_NETSSL=ON -DENABLE_CRYPTO=ON# 指定编译架构和vs版本
cmake -G "Visual Studio 17 2022" .. -DOPENSSL_ROOT_DIR=D:\OpenSSL-Win64 -DENABLE_NETSSL=ON -DENABLE_CRYPTO=ON

问题3.2 解决qt报错undefined reference to qcloud_cos...

问题定位:

  • 一开始我以为是官方说的,得自己编译poco然后替换cossdk中的文档,但是依然报错。
  • 我开始排查是否是qt编译器的问题,所以在vs中创建了一个小工程验证,果然vs可以编译通过。
  • 原因应该是:cossdk使用mvsc编译的,但是我在qt中使用的mingw构建,所以失败。

可以尝试切换 MSVC2017 64bit这个方式

image-20240805161414211

问题继续:

  1. 一开始我的QT MSVC2017是不用的,虽然我在安装的时候勾选了此项,如果一开始安装QT没有勾选MSVC编译,需要另行找办法。
  2. 也可能,跟我的QT一样,虽然有这个编译选项,但是无法选择,也无法编译成功,请继续查看问题3.3

问题3.3 QT安装了MSVC2017却无法使用

根因:VS编译版本不匹配

image-20240805161910930

解决步骤:

1、没有VS需要下载对应版本的VS,用VS但是没有该版本的话,下载插件

  • 打开vs installer

image-20240805162101013

  • 点击修改

image-20240805162242220

  • 找到对应的msvc进行下载安装。

image-20240805162325001

  • 下载Windows sdk并安装

2、记下两个目录

  • vs更新插件的目录,你的目录在上图右下角,在这个目录下找到这个文件
C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Auxiliary\Build\vcvarsall.bat
  • Windows SDK的安装目录,虽然通常会自动识别,但最好还是记录一下:
D:\Windows Kits\10\Debuggers\x64\cdb.exe 

3、一切准备就绪,最好重启一下

3、打开QT Creator进行配置

  • 打开: 工具->选项->Kits -> 编译器

image-20240805162928721

  • 点击右侧添加 -> MVSC,按照我的配置和你的目录进行配置

image-20240805163043611

  • 回到Kits首页,配置Compiler和Debugger

image-20240805163150943

这样应该可以构建成功了,如果还有问题的话,通常是库文件的换行符问题,可以查看后续的问题4。

如果是执行闪退请跳转到问题5。

问题4: 编译过程中大量报错C2065、C2614、未声明标识符等。

原因:sdk源码的换行符问题,换行符为LF。

解决办法:批量更换换行符为CR LF,查看博客——批量转换 LF 和 CRLF 的小技巧【详细步骤】

简单来说就是:

  • 下载Dos2Unix

  • 把安装好的软件bin目录加入环境变量

  • 用cmd打开需要 更换的文件夹,执行以下命令,执行完就ok

for /R %G in (*.c *.cc *.h *.mk) do unix2dos "%G" # *.c *.cc *.h *.mk 表示任意匹配这些后缀名的文件

问题5:编译成功,执行闪退。

解决办法:需要把三方目录下poco和openssl目录下的.dll文件复制到可执行程序下。

image-20240805164125184

其实可以查看缺什么补什么,我直接全部复制过来了。


如果对您有帮助的话,请点个赞哦,有其他问题可以给我留言。(づ ̄3 ̄)づ╭❤~


参考:

[1] C++ SDK 常见问题

[2] QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

[3] Qt5.14.2+VS2019配置MSVC2017

[2] QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

[3] Qt5.14.2+VS2019配置MSVC2017

[4] 批量转换 LF 和 CRLF 的小技巧【详细步骤】

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

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

相关文章

一文读懂什么是“AI算力”(建议收藏)

在当今快速发展的科技时代,人工智能(AI)已成为推动社会进步的重要力量。而AI算力,作为支撑AI技术发展的基石,其重要性不言而喻。本文将带您深入了解AI算力的概念、作用、发展趋势以及对各行业的影响。 一、AI算力的定义…

同城交易小程序的设计

管理员账户功能包括:系统首页,个人中心,商家管理,用户管理,商品分类管理,商品信息管理,订单管理,系统管理 微信端账号功能包括:系统首页,商品信息&#xff0…

【Linux】常见指令

目录 一、指令的理解二、Linux的目录结构三、XShell 下的热键四、shell命令以及运行原理五、Linux常见的指令汇总1. ls 指令1.1 常见的一些有关 ls 的别名1.2 隐藏文件或目录1.3 * 的匹配 2. pwd 指令3. cd 指令3.1 cd . . 指令 4. touch指令5. mkdir指令6. rmdir指令 &&am…

21LTR-Scene打靶渗透【附POC】(权限提升)

靶机下载地址:21LTR: Scene 1 ~ VulnHub21LTR: Scene 1, made by JayMaster2000. Download & walkthrough links are available.https://www.vulnhub.com/entry/21ltr-scene-1,3/ 1. 主机发现端口扫描目录扫描【192.168.2.120】 1.1. 主机发现 nmap -sn 192.…

数据结构----------贪心算法

什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在问题求解过程中,每一步都采取当前状态下最优(即最有利)的选择,从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…

08.SQL注入-下(超详细!!!)

1、Access注入 1.1 判断是否存在注入漏洞 ?id10 and 11 //不报错 ?id10 and 12 //报错1.2 判断字段数 ?id10 order by 1 ... ?id10 order by 7 //不报错 ?id10 order by 8 //报错 说明有7个字段1.3 猜表名 ?id10 and exists(select * from administrator) …

用队列实现栈

1 .思路及目的 用两个标准的队列(先进先出)实现栈(后进先出) 始终保持一个队列为空,往非空的栈插入数据 删除数据时,将数据导入另一个队列,留下最后一个数据(这个数据就是要删除的…

各种排序算法【持续更新中.....】

1.归并排序 归并排序 ,归并排序是采用分治法(Divide and Conquer)的一个非常典型的应用,所以我们先来说一下什么是分治法。 分治法 定义 分治(英语:Divide and Conquer),字面上的解释是「分…

什么情况?我代码没了

前两天检视代码时,发现PR里面有两个提交的描述信息一模一样,于是我提出应该将这两个提交合并成一个,保持提交树的清晰。 1 先储存起来! 而同事这时正在开发别的特性,工作区不是干净的,没法直接执行 git r…

xss漏洞(二,xss靶场搭建以及简单利用)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …

动态规划之——背包DP(进阶篇)

文章目录 概要说明多重背包(朴素算法)模板例题思路code 多重背包(二进制优化)模板例题思路code 多重背包(队列优化)模板例题思路 混合背包模板例题思路code1code2 二维费用背包模板例题思路code 概要说明 本文讲多重背包、混合背包以及二维费用背包&…

企业社会责任(CSR)国际标准有哪些?

以下是一些常见的企业社会责任(CSR)国际标准和相关体系等: 原则性、指南性标准 ISO 26000《社会责任指南》 :将社会责任归纳为7个核心方面,即公司治理、人权、劳工、环境、公平运营实践、消费者问题以及对社会发展作贡…

codetop标签双指针题目大全解析(C++解法),双指针刷穿地心!!!!!

写在前面:此篇博客是以[双指针总结]博客为基础的针对性训练,题源是codetop标签双指针近一年,频率由高到低 1.无重复字符的最长子串2.三数之和3.环形链表4.合并两个有序数组5.接雨水6.环形链表II7.删除链表的倒数第N个节点8.训练计划II9.最小覆…

餐饮业的数字化突围:价格战下的转型与新生

原文链接:https://tecdat.cn/?p37241 餐饮业价格战升级了,越打越激烈。近日,各餐饮巨头也被迫纷纷下场。 “太二酸菜鱼客单价跌至七年前” “9.9元就可以点上海底捞的一份锅底” “必胜客推出人均20元的乐享店”…… 消费降级的时代潮水&am…

dockerfile定制镜像 docker-compose编排容器

1 dockerfile dockerfile本质上是利用了Linux系统的挂载(UnionFS),将多个目录挂载到同一目录下,实现镜像的层叠式结构,从而实现功能聚合。 1.1 一个最简单的程序 package mainimport "fmt"func main() {f…

4.Redis数据结构通用命令

Redis数据结构 Redis是一个键值对的数据库。 key:大多都是String value: 类型多种多样 Redis通用命令 keys :查看所有的key 不建议在生产环境上使用keys命令,因为redis是单线程的,keys命令会搜索很长一段时间,搜索的期间redi…

Java I/O (Input/Output)——文件字节流

博客主页:誓则盟约系列专栏:Java SE 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Java I/O 简介 Java I/O(输入/输出)是 Java 程序中…

[C++] 模板进阶:特化与编译链接全解析

文章目录 非类型模板类型形参非类型模板参数代码示例 **模板的特化**为什么要有模板的特化函数模板特化使用场景与示例函数模板特化的实现细节 类模板特化全特化示例 偏特化部分优化通过进一步限制模板参数进行特化偏特化为指针类型示例:偏特化为引用类型示例&#…

menuconfig+Kconfig的简单配置

目录 1.背景 2.管理方案 2.1:.h中直接定义 2.2:.batCmake 2.3:Kconfig 2.3.1 环境安装 2.3.2 代码 2.3.2.1 目录结构 2.3.2.2 ble目录下的Kconfig 2.3.2.3 hardware目录下的Kconfig 2.3.2.4 rtos目录下的Kconfig 2.3.2.5 根目录 …

申请专利需要准备哪些材料?

申请专利需要准备哪些材料?