编译使用Aws-cpp-sdk API
在Linux系统上使用aws-cpp-sdk源码进行编译开发。操作系统使用原生的contos7Linux。
使用Aws-cpp-sdk API
一、对sdk的编译前准备
1、软件需求
此文档针对于在Linux系统上使用源码进行编译开发
操作系统使用原生的contos7Linux。
机器配置建议 内存8G以上,CPU 4个 以上
软件需求:
- GCC 4.9.0 及以上版本
- Cmake 3.12以上 3.21以下
- libcurl-devel openssl-devel libuuid-devel pulseaudio-libs-devel
2、安装gcc
先下载相关依赖,依次安装即可。
3、cmake安装
下载对应的安装包,然后解压,进入文件夹执行 ./configure即可
下载连接:https://cmake.org/download/
4、安装其他
安装libcurl-devel
Yum install libcurl-devel
安装openssl
yum install –y openssl-devel
二、aws-cpp-sdk
1、下载源码包
github源码地址 https://github.com/aws/aws-sdk-cpp
使用git的clone命令从github上进行克隆
git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp
这里因为源码包含子模块,需要进行迭代下载,使用–recurse-submodules拉取子模块
下载后需要检查是否下载完全,主要是crt文件夹下的各文件。
ps:如果在Linux上使用git 无法克隆下来(网络原因很容易失败),可以在windows上安装git,然后挂上vpn进行clone 最后检查是否成功clone完全,如果还要部分缺少,可手动下载补全。
2、构建源码
在下载完sdk代码后 在sdk源目录之外创建一个文件夹来构建文件
mkdir sdk_build
cd sdk_build
运行cmake构造文件,这里再进行构建时,指定的安装目录为 /usr/local 可以指定构建Debug还是Release版本,在构建时可以选择构建全部还是构建特定的服务,这里建议仅构建自己需要的服务。
cmake ../aws-sdk-cpp -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/usr/local/ -DCMAKE_INSTALL_PREFIX=/usr/local/ -DBUILD_SHARED_LIBS=on -DBUILD_ONLY="s3" -DENABLE_TESTING=OFF
这里需要指定在编译完成后不运行测试代码,因为如果运行实例代码有没有通过的,就会影响源码的安装,造成无法成功安装源码
make
make install
Q:
在make时如果需要一下问题此问题
是因为这里用的还是原来的gcc文件,将新的libstdc++进行链接即可
find / -name "libstdc++.so*"
查找编译生成的最新动态库
找到最新的动态库路径,然后使用cp命令将其复制到/usr/lib64目录下,切换到/usr/lib64 删除原来的软连接rm -rf libstdc++.so.6
然后将默认库的软连接指向最新库 ln -s libstdc++.so.6.0.25 libstdc++.so.6
在make执行完后,执行make install 进行安装
查看/usr/local/lib64 可以看到生产的库文件
三、测试
编写测试代码进行测试
1、S3测试
新建一个文件夹用于代码测试
mkdir test_code
cd test_code
touch main.cpp CMakeLists.txt
编写main.cpp内容
#include <aws/core/Aws.h>
#include <aws/core/utils/logging/LogLevel.h>
#include <aws/s3/S3Client.h>
#include <aws/core/auth/AWSCredentialsProviderChain.h>
#include <iostream>
int main()
{
Aws::SDKOptions options;
options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug;
Aws::InitAPI(options);
{
Aws::Client::ClientConfiguration clientConfig;
clientConfig.region = "cn-north-1";//aws region
clientConfig.verifySSL = false;
clientConfig.scheme = Aws::Http::Scheme::HTTP;
clientConfig.endpointOverride="s3.cn-north-1.amazonaws.com.cn";//server endpoint
Aws::Auth::AWSCredentials cred;
cred.SetAWSAccessKeyId("xxxxxx");//your accesskey
cred.SetAWSSecretKey("xxxxxx");//your secrekey
Aws::S3::S3Client _client(cred, clientConfig, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false);
auto outcome = _client.ListBuckets();
if (outcome.IsSuccess()) {
std::cout << "Found " << outcome.GetResult().GetBuckets().size() << " buckets\n";
for (auto&& b : outcome.GetResult().GetBuckets()) {
std::cout << b.GetName() << std::endl;
}
}
else {
std::cout << "Failed with error: " << outcome.GetError() << std::endl;
}
}
Aws::ShutdownAPI(options);
return 0;
}
编写CMakeLists.txt内容
cmake_minimum_required(VERSION 3.3)
set(CMAKE_CXX_STANDARD 11)
project(test LANGUAGES CXX)
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
set(BUILD_SHARED_LIBS ON CACHE STRING "Link to shared libraries by default.")
#Load required services/packages: This basic example uses S3.
find_package(AWSSDK REQUIRED COMPONENTS s3)
add_executable(${PROJECT_NAME} "main.cpp")
set_compiler_flags(${PROJECT_NAME})
set_compiler_warnings(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} ${AWSSDK_LINK_LIBRARIES})
然后创建一个文件夹build,再此文件夹中使用cmake进行构建
mkdir build
cd build
cmake ../
make
Q:
在cmake时遇到此错误
这是因为Amazon Linux 2 是一个基于 yum 的发行版,它有一个用于 OpenSSL 加密静态库的专用包,称为openssl-static
(未包含在开发包中)。
使用sudo yum install openssl-static
安装 ,然后再次cmake
在make生成可执行文件后,执行程序时出现如下错误:
这里是没有找到共享库,于是使用export来配置一下环境变量,使得程序可以正确找到库。
使用export是暂时修改,仅限本次的当前终端有效。可以通过修改CMakeLists文件或者修改系统环境变量等方法来让程序能够顺利找到库即可。
执行结果如下:
2、EC2测试
因为前面只安装了S3的源码,这里先进入sdk_build文件夹编译安装EC2的源码
cmake ../aws-sdk-cpp -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/usr/local/ -DCMAKE_INSTALL_PREFIX=/usr/local/ -DBUILD_SHARED_LIBS=on -DBUILD_ONLY="ec2" -DENABLE_TESTING=OFF
因为EC2的源码包很大,在进行make编译动态库的时候,会花费较长的时间,所以建议将机器性能设置的高一些。
编写代码使用sdk的api为aws中的ec2实例的卷创建一个快照
main.cpp
#include <aws/core/Aws.h>
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/CreateSnapshotRequest.h>
#include <aws/ec2/model/CreateSnapshotResponse.h>
#include <aws/core/auth/AWSCredentialsProviderChain.h>
#include <iostream>
int main()
{
Aws::SDKOptions options;
Aws::InitAPI(options);
{
Aws::Client::ClientConfiguration clientConfig;
clientConfig.region = "cn-north-1";
//don't known why when i add endpointOverride info ,the program output Couldn't connect to server
//clientConfig.verifySSL = false;
//clientConfig.scheme = Aws::Http::Scheme::HTTP;
//clientConfig.endpointOverride="ec2messages.cn-north-1.amazonaws.com.cn";
Aws::Auth::AWSCredentials cred;
cred.SetAWSAccessKeyId("xxxx");
cred.SetAWSSecretKey("xxxx");
Aws::EC2::EC2Client ec2(cred,clientConfig);
Aws::EC2::Model::CreateSnapshotRequest cr_sr;
cr_sr.SetVolumeId("your volume Id");
auto cs_out = ec2.CreateSnapshot(cr_sr);
if (cs_out.IsSuccess())
{
std::cout << "Successfully create snapshop from volumes as:";
std::cout << " " << cs_out.GetResult().GetVolumeId()<<" size :"<<cs_out.GetResult().GetVolumeSize();
std::cout << std::endl;
}
else
{
std::cout << "Error describing volumes" << cs_out.GetError().GetMessage()
<< std::endl;
}
}
Aws::ShutdownAPI(options);
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
set(CMAKE_CXX_STANDARD 11)
project(test LANGUAGES CXX)
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
set(BUILD_SHARED_LIBS ON CACHE STRING "Link to shared libraries by default.")
# Locate the aws sdk for c++ package.
find_package(AWSSDK REQUIRED COMPONENTS elasticbeanstalk ec2)
add_executable(${PROJECT_NAME} "main.cpp")
set_compiler_flags(${PROJECT_NAME})
set_compiler_warnings(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} ${AWSSDK_LINK_LIBRARIES})
ps:这里可以看到除了需要ec2这个包,还需要elasticbeanstalk这个包,于是也需要在源码里对这个包进行安装。
执行代码
创建了一个新的快照
更多推荐
所有评论(0)