腾讯云COS C++ SDK使用记录

目前有将服务器指定文件上传的需求, 手头正好有免费的COS资源使用, 于是使用COS作为存储工具

腾讯云COS C++ SDK 文档如下

https://cloud.tencent.com/document/product/436/12301

本次文件上传流程

基于

  • Ubuntu20.04LTS
  • CLion 2022.1

建立工程

参照官方SDK的Demo

https://github.com/tencentyun/cos-cpp-sdk-v5

文件上传的CMakeLists.txt如下

cmake_minimum_required(VERSION 3.5)

project(auto-backup CXX)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function")

set(SYSTEM_LIBS stdc++ pthread)

include_directories("${CMAKE_SOURCE_DIR}/thirdparty/include")

add_executable(${PROJECT_NAME} main.cc)

# 使用动态库
target_link_libraries(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/thirdparty/lib/cos/libcossdk-shared.so ${SYSTEM_LIBS})

项目结构如下

├── cmake-build-debug
│
├── CMakeLists.txt
│
├── main.cc
│
├── oss_config.json
│
└── thirdparty
    │
    ├── include
    │      │
    │      ├── cos
    │      │
    │      └── Poco
    │
    └── lib
        │
        └── cos

main.cc内容如下

#include <unistd.h>
#include <chrono>
#include <ctime>
#include <iomanip>
#include <cstring>
#include "cos/cos_api.h"
#include "cos/cos_defines.h"
#include "cos/cos_config.h"
#include "cos/request/object_req.h"
#include "cos/response/object_resp.h"


int main(int argc, char *argv[]) {
    // 1. 指定配置文件路径,初始化 CosConfig
    qcloud_cos::CosConfig config("../config.json");
    qcloud_cos::CosAPI cos(config);

    // 2. 构造上传文件的请求
    std::string bucket_name = "examplebucket-1250000000"; // 替换为用户的存储桶名,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
    std::string object_name = "exampleobject"; //exampleobject 即为对象键(Key),是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/pic.jpg 中,对象键为 doc/pic.jpg,替换为用户指定的对象名。
    qcloud_cos::PutObjectByFileReq req(bucket_name, object_name, "/path/to/local/file"); // 替换为用户指定的文件路径
    //req.SetXCosStorageClass("STANDARD_IA"); // 默认为STANDARD,可以调用 Set 方法设置存储类型
    qcloud_cos::PutObjectByFileResp resp;

    // 3. 调用上传文件接口
    qcloud_cos::CosResult result = cos.PutObject(req, &amp;resp);

    // 4. 处理调用结果
    if (result.IsSucc()) {
        // 上传文件成功
    } else {
        // 上传文件失败,可以调用 CosResult 的成员函数输出错误信息,比如 requestID 等
        std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
        std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
        std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
        std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
        std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
        std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
        std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
    }
}

一开始是使用的官方SDK Demo中提供的库文件, 但编译不通过

报错未定义的引用

比如

undefined reference to `typeinfo for qcloud_cos::BaseResp'

以及

libPocoCrypto.so.64: undefined reference to `EVP_PKEY_set1_RSA@libcrypto.so.10'

查阅文档, 需要自己编译对应依赖

1. 编译Poco

wget https://github.com/pocoproject/poco/archive/refs/tags/poco-1.9.4-release.zip
cd poco-poco-1.9.4-release/
./configure --omit=Data/ODBC,Data/MySQL
mkdir my_build
cd my_build
cmake .. 
make -j5

若编译 poco 库的时候无法编译出 PocoNetSSL 库,一般是因为机器没装 openssl-devel 库, 自行安装后再次编译Poco

编译完成后, 将编译好的poco lib覆盖到third_party的Poco目录下

将Demo中的install-libpoco.sh文件都加上-f参数以覆盖之前的操作,

比如

ln -s -f libPocoCrypto.so.64 libPocoCrypto.so

执行

sh install-libpoco.sh

Poco库完成

2. 编译COS SDK

修改SDK Demo中的CMakeLists.txt, 开启编译动态库选项

option(BUILD_SHARED_LIB "Build shared library" ON)

然后 line:46 替换为

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra")

在Demo目录中

mkdir -p build 
cd build 
cmake .. 
make

编译完成后, 将build/lib目录下的库文件复制到自己工程

编译启动main.cc, 查看COS面板, 文件上传成功

完成

上传COS项目源码

https://github.com/MQPearth/auto-backup


番外

静态链接

  1. 编译静态Poco库

Poco/CMakeLists.txt line:118改为ON

option(POCO_STATIC
  "Set to OFF|ON (default is OFF) to control build of POCO as STATIC library" ON)

然后重复之前步骤

然后将编译后的.a库文件复制到自己项目的lib/Poco目录里

修改自己项目的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(auto-backup CXX)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function")

set(SYSTEM_LIBS stdc++ pthread)

set(CMAKE_EXE_LINKER_FLAGS "-static")

include_directories("${CMAKE_SOURCE_DIR}/thirdparty/include")

add_executable(${PROJECT_NAME} main.cc)

# 链接 openssl 静态库
find_library(SSL_LIB libssl.a REQUIRED)
find_library(CRYPTO_LIB libcrypto.a REQUIRED)


target_link_libraries(${PROJECT_NAME}
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/cos/libcossdk.a

        -Wl,--start-group
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoNetSSL.a

        ${SSL_LIB}
        ${CRYPTO_LIB}
        ${CMAKE_DL_LIBS}

        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoCrypto.a
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoNet.a
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoJSON.a
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoFoundation.a
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoUtil.a
        ${CMAKE_SOURCE_DIR}/thirdparty/lib/Poco/libPocoXML.a

        -Wl,--end-group

        ${SYSTEM_LIBS})

然后重新cmake && make

可以看到生成的文件足足有52.3M, 不过好处就是只有一个文件, 不需要再编译动态库

原文地址:https://cloud.tencent.com/developer/article/2078398

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340