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”
- 解决办法:官方下载的sdk只允许进行Release 编译,记得更改。同样的,在QT中使用该SDK也只允许
release
构建/运行。
Tips: 如果需要debug的话,请按照官方文档重新配置:Windows Debug 版本编译指南 。这个我目前还没试过,估计也是很坑
问题2:在QT中引入头文件编译报错: fatal error: cos_api.h: No such file or directory
解决办法:
- 将编译好的cossdk下的include、libs、third_party三个目录移动到工程目录下,并且将编译好的
cossdk.lib
放到libs目录下
- 在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...
真正的重头戏来了,遇到这个问题的同学请注意!
请看官方文档: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这个方式
问题继续:
- 一开始我的QT MSVC2017是不用的,虽然我在安装的时候勾选了此项,如果一开始安装QT没有勾选MSVC编译,需要另行找办法。
- 也可能,跟我的QT一样,虽然有这个编译选项,但是无法选择,也无法编译成功,请继续查看问题3.3
问题3.3 QT安装了MSVC2017却无法使用
根因:VS编译版本不匹配
解决步骤:
1、没有VS需要下载对应版本的VS,用VS但是没有该版本的话,下载插件
- 打开vs installer
- 点击修改
- 找到对应的msvc进行下载安装。
- 下载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 -> 编译器
- 点击右侧
添加 -> MVSC
,按照我的配置和你的目录进行配置
- 回到Kits首页,配置Compiler和Debugger
这样应该可以构建成功了,如果还有问题的话,通常是库文件的换行符问题,可以查看后续的问题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文件复制到可执行程序下。
其实可以查看缺什么补什么,我直接全部复制过来了。
如果对您有帮助的话,请点个赞哦,有其他问题可以给我留言。(づ ̄3 ̄)づ╭❤~
参考:
[1] C++ SDK 常见问题
[2] QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境