只需要s3接口,因此编译选项(考虑到离线下载编译,我用的是aws-sdk-cpp-1.0.164)
mkdir build
cd build
cmake .. -DBUILD_ONLY="s3" -DCMAKE_BUILD_TYPE=Debug
make
然后会报如下错误
/home/workspace/aws-sdk-cpp-1.0.164/aws-cpp-sdk-core/source/client/AWSClient.cpp: In member function ‘virtual Aws::Client::AWSError<Aws::Client::CoreErrors> Aws::Client::AWSJsonClient::BuildAWSError(const std::shared_ptr<Aws::Http::HttpResponse>&) const’:
/home/workspace/aws-sdk-cpp-1.0.164/aws-cpp-sdk-core/source/client/AWSClient.cpp:621:111: error: implicitly-declared ‘Aws::Client::AWSError<Aws::Client::CoreErrors>& Aws::Client::AWSError<Aws::Client::CoreErrors>::operator=(const Aws::Client::AWSError<Aws::Client::CoreErrors>&)’ is deprecated [-Werror=deprecated-copy]
621 | error = AWSError<CoreErrors>(CoreErrors::NETWORK_CONNECTION, "", "Unable to connect to endpoint", true);
经排查,发现AWSError没有定义operation=,然后类中添加如下定义,编译通过
AWSError<CoreErrors>& operator=(AWSError<CoreErrors>&& rhs)
{
m_errorType = static_cast<ERROR_TYPE>(rhs.GetErrorType());
m_exceptionName = rhs.GetExceptionName();
m_message=rhs.GetMessage();
m_responseHeaders = rhs.GetResponseHeaders() ;
m_responseCode = rhs.GetResponseCode();
m_isRetryable = rhs.ShouldRetry();
return *this;
}
备注,不能使用 AWSError<CoreErrors>& operator=( AWSError<CoreErrors>& rhs ),否则会报错
[ 0%] Building CXX object aws-cpp-sdk-core/CMakeFiles/aws-cpp-sdk-core.dir/source/client/AWSClient.cpp.o
/home/workspace/aws-sdk-cpp-1.0.164/aws-cpp-sdk-core/source/client/AWSClient.cpp: In member function ‘virtual Aws::Client::AWSError<Aws::Client::CoreErrors> Aws::Client::AWSJsonClient::BuildAWSError(const std::shared_ptr<Aws::Http::HttpResponse>&) const’:
/home/workspace/aws-sdk-cpp-1.0.164/aws-cpp-sdk-core/source/client/AWSClient.cpp:621:17: error: cannot bind non-const lvalue reference of type ‘Aws::Client::AWSError<Aws::Client::CoreErrors>&’ to an rvalue of type ‘Aws::Client::AWSError<Aws::Client::CoreErrors>’
621 | error = AWSError<CoreErrors>(CoreErrors::NETWORK_CONNECTION, "", "Unable to connect to endpoint", true);
看调用是
error = AWSError<CoreErrors>(CoreErrors::NETWORK_CONNECTION, "", "Unable to connect to endpoint", true);
赋值的是临时构造对象,临时对象是右值,无法作为 左值引用入参 使用。
备注增加两篇左值右值区别的不错总结:
C11新增右值的三大规则: https://www.jianshu.com/p/b90d1091a4ff
右值引用的移动语义(Move Semantics)和完美转发(Perfect Forwarding) 两个基本特性:
https://www.cnblogs.com/kekec/p/10810507.html