编译使用Aws-cpp-sdk API

使用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时如果需要一下问题此问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjwDNc2G-1658300042218)(image\image-20220720145050813.png)]

是因为这里用的还是原来的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(
<think>我们遇到了AWSSDK的链接错误,主要是由于静态库的链接顺序不正确。链接器在解析依赖时是从左到右的,所以需要将基础库放在右边(依赖它们的库放在左边)。根据AWSSDK的依赖关系,我们应该按照从高层到底层的顺序链接,即:依赖于其他库的库应该放在被依赖库的前面(左边)。根据AWSSDK的依赖关系,正确的链接顺序应该是:1.高层库(如`aws-cpp-sdk-core`)需要依赖底层的库(如`aws-c-common`等),所以高层库应该放在左边,底层库放在右边。但是,实际上链接器的规则是:如果库A依赖库B,那么库A应该出现在库B的左边(即先出现库A,再出现库B)。因为链接器在扫描库列表时,遇到未定义的符号,会到后面的库中去寻找。因此,正确的顺序应该是:从最顶层的应用库(如`aws-cpp-sdk-s3`)开始,然后到`aws-cpp-sdk-core`,再到底层的C库(如`aws-c-s3`,`aws-c-auth`等),最后是系统库。根据AWS官方文档和实际经验,推荐的链接顺序是(从高到低):-aws-cpp-sdk-s3-aws-cpp-sdk-core-aws-c-s3-aws-crt-cpp-aws-c-auth-aws-c-http-aws-c-io-aws-c-compression-aws-c-cal-s2n-aws-checksums-aws-c-common另外,还需要链接系统库,如OpenSSL(-lcrypto-lssl)、libcurl(-lcurl)、zlib(-lz)和线程库(-lpthread)等。但是,请注意,你给出的库列表中包含了一些我们可能没有直接使用的库(如`aws-c-sdkutils`、`aws-c-event-stream`、`aws-c-mqtt`),这些库可能需要根据实际使用的服务来链接。对于S3服务,我们主要需要`s3`相关的库。因此,调整链接顺序如下(按照从高层到底层,即链接顺序从左到右):1.`aws-cpp-sdk-s3`(最高层,依赖于core和aws-c-s3等)2.`aws-cpp-sdk-core`3.`aws-c-s3`4.`aws-crt-cpp`5.`aws-c-auth`6.`aws-c-http`7.`aws-c-io`8.`aws-c-compression`9.`aws-c-cal`10.`s2n`11.`aws-checksums`12.`aws-c-common`然后,再链接系统库(如`-lcurl-lcrypto-lssl-lz-lpthread`)。在CMake中,我们可以通过`target_link_libraries`按顺序添加这些库。如果你使用的是Makefile,则需要在链接命令中按照上述顺序排列。示例(CMake):```cmaketarget_link_libraries(your_targetaws-cpp-sdk-s3aws-cpp-sdk-coreaws-c-s3aws-crt-cppaws-c-authaws-c-httpaws-c-ioaws-c-compressionaws-c-cals2naws-checksumsaws-c-common${CMAKE_THREAD_LIBS_INIT}#或者直接写-lpthreadcurlsslcryptoz)```注意:上述顺序中,`aws-cpp-sdk-core`和`aws-c-s3`的顺序可能需要调整。实际上,`aws-cpp-sdk-s3`可能依赖于`aws-cpp-sdk-core`,所以`aws-cpp-sdk-core`应该在`aws-cpp-sdk-s3`的右边(即后面)。但是根据链接器的规则,被依赖的库应该放在后面。所以,如果A依赖B,那么A在左,B在右。因此:`aws-cpp-sdk-s3`依赖`aws-cpp-sdk-core`,所以顺序是:先`aws-cpp-sdk-s3`,然后`aws-cpp-sdk-core`。然而,实际上`aws-cpp-sdk-core`是一个基础库,很多库都依赖它,所以它应该出现在较左边的位置?这里需要澄清:在链接顺序中,如果一个库被多个库依赖,它应该出现在依赖它的所有库的后面(即更靠右)。所以,对于同时链接多个库的情况,我们应该按照依赖关系的拓扑顺序,从依赖链的顶端(叶子节点)到底部(根节点)排列。例如:A依赖B,B依赖C。那么链接顺序应该是:ABC因此,对于AWSSDK,我们可以按照以下规则排列:1.将最顶层的服务库(如s3)放在最左边。2.然后是核心库(core)。3.接着是底层的C库(如auth,http,io等)。但是,由于依赖关系比较复杂,有时候可能需要调整。我们可以使用工具(如CMake)自动处理依赖关系,或者使用链接器的`--start-group`和`--end-group`选项来循环解析依赖。如果使用gcc链接器,可以这样:```bashg++...-Wl,--start-group-laws-cpp-sdk-s3-laws-cpp-sdk-core-laws-c-s3-laws-crt-cpp-laws-c-auth-laws-c-http-laws-c-io-laws-c-compression-laws-c-cal-ls2n-laws-checksums-laws-c-common-Wl,--end-group-lcurl-lcrypto-lssl-lz-lpthread```使用`--start-group`和`--end-group`可以让链接器重复扫描组内的库,直到所有符号都被解析,这样就不需要严格排序了。但是,这可能会增加链接时间。所以,推荐的方法是先尝试正确的顺序,如果顺序很难确定,再使用分组。根据你的错误信息,主要是缺少`aws-crt-cpp`中的符号,所以请确保`aws-crt-cpp`库被链接,并且位置在`aws-cpp-sdk-core`之后(即更靠右)。总结步骤:1.按照上述推荐的顺序调整库的链接顺序。2.确保所有必要的系统库(OpenSSL,libcurl,zlib,pthread)都已链接。3.如果调整顺序仍然不能解决,尝试使用`--start-group`和`--end-group`。另外,请注意,如果使用静态库,确保这些库是用兼容的选项编译的(如相同的ABI,相同的编译选项等)。希望这些信息能帮助你解决链接问题。</think>为了解决 AWS SDK 的链接顺序问题,以下是正确的库链接顺序和解决方案: ### 正确的 AWS 库链接顺序 根据 AWS SDK 的依赖关系,链接顺序应**从底层依赖到高层服务**,按以下顺序排列: ```mermaid graph BT A[aws-c-common] --> B[aws-checksums] B --> C[s2n] C --> D[aws-c-cal] D --> E[aws-c-compression] E --> F[aws-c-io] F --> G[aws-c-http] G --> H[aws-c-auth] H --> I[aws-c-sdkutils] I --> J[aws-c-event-stream] J --> K[aws-c-mqtt] K --> L[aws-c-s3] L --> M[aws-crt-cpp] M --> N[aws-cpp-sdk-core] N --> O[aws-cpp-sdk-s3] ``` ### 解决方案 #### 1. 命令行链接顺序(GCC/Clang) ```bash g++ your_app.cpp \ -laws-cpp-sdk-s3 \ -laws-cpp-sdk-core \ -laws-crt-cpp \ -laws-c-s3 \ -laws-c-mqtt \ -laws-c-event-stream \ -laws-c-sdkutils \ -laws-c-auth \ -laws-c-http \ -laws-c-io \ -laws-c-compression \ -laws-c-cal \ -ls2n \ -laws-checksums \ -laws-c-common \ -lcurl -lssl -lcrypto -lz -lpthread ``` #### 2. CMake 配置(推荐) ```cmake # 在 CMakeLists.txt 中添加 target_link_libraries(your_target PRIVATE aws-cpp-sdk-s3 aws-cpp-sdk-core aws-crt-cpp aws-c-s3 aws-c-mqtt aws-c-event-stream aws-c-sdkutils aws-c-auth aws-c-http aws-c-io aws-c-compression aws-c-cal s2n aws-checksums aws-c-common ${CMAKE_THREAD_LIBS_INIT} # pthread ${OPENSSL_CRYPTO_LIBRARY} # -lcrypto ${OPENSSL_SSL_LIBRARY} # -lssl CURL::libcurl # -lcurl ZLIB::ZLIB # -lz ) ``` ### 关键原则 1. **依赖方向**:$$ \text{高层服务} \rightarrow \text{核心库} \rightarrow \text{底层基础库} $$ - 服务层(如 s3)在最前 - 基础库(如 aws-c-common)在最后 2. **符号解析规则**: - 链接器从左向右解析未定义符号 - 被依赖的库必须出现在依赖它的库的右边 - 错误示例:`aws-cpp-sdk-core` 在 `aws-c-common` 左边会导致未定义符号 3. **系统库顺序**: ```mermaid graph LR OpenSSL[OpenSSL] -->|依赖| zlib[zlib] libcurl -->|依赖| OpenSSL AWS基础库 -->|依赖| libcurl ``` 系统库顺序:`-lcurl -lssl -lcrypto -lz` ### 验证方法 1. 检查符号依赖: ```bash nm -u libaws-cpp-sdk-core.a | grep 'U aws_' ``` 2. 确认符号在后续库中定义: ```bash nm -gC libaws-c-common.a | grep 'aws_byte_cursor' ``` ### 错误原因分析 您的错误 `undefined reference to Aws::Crt::ByteCursorFromArray` 表明: 1. `libaws-cpp-sdk-core.a` 需要 `aws-crt-cpp` 的符号 2. 但 `aws-crt-cpp` 出现在链接顺序的后面 3. 解决方案:将 `aws-crt-cpp` 移到 `aws-cpp-sdk-core` 之后 > 参考 AWS 官方构建指南:[AWS C++ SDK 构建文档](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/setup.html)[^1]
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值