首先,我对c/c++的了解仅限于编译,其中实际包括编写用于教育目的的编译器。现在我的工作涉及手动创建AWS S3桶,并将一些文件放入其中,并从Qt应用程序(基本上是c++代码)访问。
我到目前为止所做的是按照这里提到的步骤构建AWS SDK CPP。
然后创建一个目录的。h文件撕开源代码只保留。h文件的power shell脚本:
$folders = Get-ChildItem -Path "D:qt-awsxxxxxxxxxxxxxxxxxxxx" -Filter *.* -Exclude *.h -Recurse
foreach ($file in $folders)
{
if(Test-Path $file -Exclude *.h -PathType leaf)
{
echo "deleting $file"
del $file
}
else
{
}
}
Write-Host "Congratulations! Your first script executed successfully"
我的AWSS3Access Qt项目配置文件包含
TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
AWS_DIR = "C:/Program Files/AWS"
AWS_SDK_DIR = "C:/Program Files/AWS/AWS_BUILD"
INCLUDEPATH *= $${AWS_DIR}/aws-sdk-cpp/aws-cpp-sdk-s3/include
$${AWS_DIR}/aws-sdk-cpp/aws-cpp-sdk-core/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/crt/aws-c-common/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/crt/aws-c-common/verification/cbmc/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/crt/aws-c-io/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/crt/aws-c-mqtt/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/crt/aws-c-auth/include
$${AWS_DIR}/aws-sdk-cpp/crt/aws-crt-cpp/crt/aws-c-sdkutils/include
LIBS *= -L$${AWS_SDK_DIR} -laws-cpp-sdk-s3
-L$${AWS_SDK_DIR} -laws-cpp-sdk-core
-L$${AWS_SDK_DIR} -laws-crt-cpp
-L$${AWS_SDK_DIR} -laws-c-auth
-L$${AWS_SDK_DIR} -laws-c-cal
-L$${AWS_SDK_DIR} -laws-c-common
-L$${AWS_SDK_DIR} -laws-c-compression
-L$${AWS_SDK_DIR} -laws-c-event-stream
-L$${AWS_SDK_DIR} -laws-checksums
-L$${AWS_SDK_DIR} -laws-c-http
-L$${AWS_SDK_DIR} -laws-c-io
-L$${AWS_SDK_DIR} -laws-c-mqtt
-L$${AWS_SDK_DIR} -laws-c-s3
-L$${AWS_SDK_DIR} -laws-c-sdkutils
SOURCES +=
AwsS3Master.cpp
main.cpp
HEADERS +=
AwsS3Master.hpp
AWSS3Master.hpp
#ifndef AWSS3MASTER_HPP
#define AWSS3MASTER_HPP
#define USE_IMPORT_EXPORT
#include <iostream>
#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/ListObjectsRequest.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/s3/model/Object.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <fstream>
#include <QString>
#include <QStringList>
class AwsS3Master
{
public:
AwsS3Master();
void listObjects();
void setBucket(const Aws::String& bucketName);
void setRegion(const Aws::String& region);
private:
Aws::String _region{"region"};
Aws::String _bucket{"bucket"};
Aws::String accessKey{"XXXXXXXXXXXXXXXXXX"};
Aws::String accessSecret{"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"};
};
#endif // AWSS3MASTER_HPP
和cpp文件AWSS3Master.cpp文件有一个名为list objects的函数
void AwsS3Master::listObjects()
{
Aws::SDKOptions options;
Aws::InitAPI(options);
{
Aws::Client::ClientConfiguration clientConfig;
if (!_region.empty())
{
clientConfig.region = _region;
}
Aws::Auth::AWSCredentials credentials;
credentials.SetAWSAccessKeyId(Aws::String(accessKey));
credentials.SetAWSSecretKey(Aws::String(accessSecret));
Aws::S3::S3Client s3_client(credentials, clientConfig);
// s3_client.
Aws::S3::Model::ListObjectsRequest objects_request;
objects_request.WithBucket(_bucket);//.WithPrefix("some-prefox");
bool isDone = false;
bool isFailed= false;
Aws::S3::Model::ListObjectsOutcome outcome;
int c=0;
while(!isDone) {
outcome=s3_client.ListObjects(objects_request);
if(!outcome.IsSuccess()) break;
//process
Aws::Vector<Aws::S3::Model::Object> object_list = outcome.GetResult().GetContents();
for (auto const &s3_object : object_list)
{
std::cout << "* " << s3_object.GetKey() << std::endl;
c++;
}
std::cout<<"--------- Break"<<c<<"n";
isDone=!outcome.GetResult().GetIsTruncated();
if(!isDone) {
//objects_request.SetMarker(outcome.GetResult().GetNextMarker());
objects_request.SetMarker(outcome.GetResult().GetContents().back().GetKey());
}
}
std::cout << "Count "<<c<<"n";
//check isFailed
if(!outcome.IsSuccess()) {
std::cout << "ListObjects error: " <<
outcome.GetError().GetExceptionName() << " " <<
outcome.GetError().GetMessage() << std::endl;
}
}
Aws::ShutdownAPI(options);
}
main.cpp有
#include <iostream>
#include <AwsS3Master.hpp>
using namespace std;
int main()
{
AwsS3Master awss3;
Aws::SDKOptions options;
//TODO: Change bucket_name to the name of a bucket in your account.
const Aws::String bucket_name = "xxxxxxxxxxxxxx";
//TODO: Set to the AWS Region in which the bucket was created.
const Aws::String region = "xxxxxxxxxxx";
std::cout << "Beginning of file contents:n";
awss3.setBucket(bucket_name);
awss3.setRegion(region);
awss3.listObjects();
return 0;
}
虽然所有这些都列出了bucket中的文件..我想把这个项目作为另一个项目的子项目包含进去它使用它来访问s3桶。我正试着把我的头绕在像静态链接和动态链接库等东西上
我使用了源文件中的。h文件,命令
生成的。lib和。dll文件。cmake ..awsaws-sdk-cpp -DCMAKE_BUILD_TYPE=Debug -DBUILD_ONLY="s3"
这种方法正确吗?是否有其他更简单的方法可以将AWS-SDK-CPP包含到我的Qt应用程序中?尤其是创建pri/pro文件应该比我所做的更容易。我知道MSBuild步骤中创建库文件C:Program Files (x86) aws-cpp-sdk-allbin它与lib和include文件夹一起可以被使用。
经过这么多的失误,我终于发现在。pro/。你可以在调试和发布之间切换,比如
Debug: AWS_SDK_DIR = "C:/Program Files/AWS/Debug/AWS_BUILD"
Release: AWS_SDK_DIR = "C:/Program Files/AWS/Release/AWS_BUILD"
存放你的lib文件。和
中的DLL文件Debug: AWS_SDK_DIR_BIN = "C:/Program Files/AWS/Debug/bin"
Release: AWS_SDK_DIR_BIN = "C:/Program Files/AWS/Release/bin"
最后,只需在相应的bin文件夹中包含dll
这样的
LIBS += -L$${AWS_SDK_DIR_BIN}
你的项目编译/构建/运行在调试和发布模式下都没有问题。