1. 현상

 

한 솔루션에서 S3 지원 업그레이드 소스를 작성하고 다른 솔루션에 적용하기 위해 소스코드를 그대로 가져와 컴파일하는 도중에 Aws::MakeShared에서 "std::shared_ptr<Aws::FStream>"에서 "std::shared_ptr<Aws::IOStream>"으로의 사용자 정의 변환이 적절하지 않습니다. 라는 이상한 에러가 발생합니다.

 

std::shared_ptr<Aws::IOStream> input_data = Aws::MakeShared<Aws::FStream>("SampleAllocationTag", objectName.c_str(), std::ios_base::in | std::ios_base::binary);

 

 

 

 

2. 원인 및 수정.

 

소스코드를 제대로 보지 않고 필요한 헤더만 찾아서 코딩해 발생한 에러였습니다.

 

github.com/aws/aws-sdk-cpp/issues/1168

 

Compilation errors for file upload via S3Client PutObject in C++ on Mac · Issue #1168 · aws/aws-sdk-cpp

What platform/OS are you using? Darwin 17.7.0 Darwin Kernel Version 17.7.0: Wed Apr 24 21:17:24 PDT 2019; root:xnu-4570.71.45~1/RELEASE_X86_64 x86_64 Which version of the SDK? master branch of aws-...

github.com

 

위의 이슈를 제기한 분도 저랑 동일한 실수를 저질렀나 봅니다. 다시 한번 AWS의 예시 코드를 확인했습니다. 

 

Upload an Object

 

Operations on Objects - AWS SDK for C++

Operations on Objects An Amazon S3 object represents a file, which is a collection of data. Every object must reside within a bucket. These code snippets assume that you understand the material in Getting Started Using the AWS SDK for C++ and have configur

docs.aws.amazon.com

 

#include <iostream>
#include <fstream>
#include <sys/stat.h>
#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <awsdoc/s3/s3_examples.h>

bool AwsDoc::S3::PutObject(const Aws::String& bucketName, 
    const Aws::String& objectName,
    const Aws::String& region)
{
    // Verify that the file exists.
    struct stat buffer;

    if (stat(objectName.c_str(), &buffer) == -1)
    {
        std::cout << "Error: PutObject: File '" <<
            objectName << "' does not exist." << std::endl;

        return false;
    }

    Aws::Client::ClientConfiguration config;

    if (!region.empty())
    {
        config.region = region;
    }

    Aws::S3::S3Client s3_client(config);
    
    Aws::S3::Model::PutObjectRequest request;
    request.SetBucket(bucketName);
    request.SetKey(objectName);

    std::shared_ptr<Aws::IOStream> input_data = 
        Aws::MakeShared<Aws::FStream>("SampleAllocationTag", 
            objectName.c_str(), 
            std::ios_base::in | std::ios_base::binary);

    request.SetBody(input_data);

    Aws::S3::Model::PutObjectOutcome outcome = 
        s3_client.PutObject(request);

    if (outcome.IsSuccess()) {

        std::cout << "Added object '" << objectName << "' to bucket '"
            << bucketName << "'.";
        return true;
    }
    else 
    {
        std::cout << "Error: PutObject: " << 
            outcome.GetError().GetMessage() << std::endl;
       
        return false;
    }
}

 

코드만 보지말고 위의 include를 잘 보면 "include <fstream>"이 존재합니다. fstream을 include 해주면 문제없이 잘 컴파일됩니다.

 

 

 

 

 

반응형

+ Recent posts