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

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

前情提要:因为需要在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

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 的小技巧【详细步骤】

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值