如何将AWS SDK CPP从源代码构建到Qt/QML应用程序子目录项目?



首先,我对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}

你的项目编译/构建/运行在调试和发布模式下都没有问题。