c++ - 与 AWS SDK 的链接问题

标签 c++ amazon-web-services linker-errors

我对 AWS SDK 和 Linux 的了解有限,但我一直在阅读 GCC 和 CMake 语法,并尝试让自己在 AWS 上编译和运行示例 https://docs.aws.amazon.com/cloud9/latest/user-guide/sample-cplusplus.html#sample-cplusplus-sdk 。这是我第二次尝试解决这个问题。

这是我运行的环境:

  • AWS Linux 云 9
  • gcc (GCC) 7.2.1 20170915(红帽 7.2.1-2)
  • GNU Make 3.82
  • cmake3版本3.6.1

我使用了以下命令:

- sudo yum -y install libcurl-devel openssl-devel libuuid-devel cmake3
 - git clone https://github.com/aws/aws-sdk-cpp.git
 - mkdir sdk_build
 - cd sdk_build
 - cmake3 ../aws-sdk-cpp -DBUILD_ONLY="s3"
 - sudo make
 - sudo make install

构建并运行AWS SDK代码:

https://docs.aws.amazon.com/cloud9/latest/user-guide/sample-cplusplus.html#sample-cplusplus-sdk-code

我使用的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(s3-demo)
find_package(aws-sdk-cpp)
add_definitions(-DUSE_IMPORT_EXPORT)
add_executable(s3-demo s3-demo.cpp)
target_link_libraries(s3-demo aws-cpp-sdk-s3)

我的模块/目录:

environment
- .c9
- aws-sdk-cpp #This is the git source DIR
- sdk_build #This is the build DIR
- CMakeLists.txt (see above)
- hello.cpp
- hello.cpp.o  

问题:

许多 undefined reference ,这里是一个片段:

  • Aws::Client::ClientConfiguration::ClientConfiguration()
  • Aws::InitAPI(Aws::SDKOptions const&)
  • Aws::S3::S3Client::S3Client(Aws::Client::ClientConfiguration const&, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy, bool, Aws::S3::US_EAST_1_REGIONAL_ENDPOINT_OPTION)
  • 对 `Aws::S3::S3Client::~S3Client() 的 undefined reference
  • Aws::Client::AWSClient::AWSClient(Aws::Client::AWSClient const&) 的一些链接问题

我想知道的是:

  1. 我知道 -L 有助于识别我要使用的共享库文件夹,而 -l 有助于识别我要使用的共享文件。不过,我已了解到,在按照网站上的说明构建上述 AWS 项目时,目标和标志应该自动填充,并且我不需要执行任何特殊链接即可使该项目正常运行。

  2. 看起来 aws-cpp-sdk-core 和 aws-cpp-sdk-s3 位于我的源文件夹 aws-sdk-cpp 中。这应该在我的构建文件夹 sdk_build 中吗?我是否正确编译了我的项目?

  3. 如何成功构建源文件夹 aws-sdk-cpp 以及是否应该在 aws-sdk-cpp 中构建源文件夹内?

感谢您对我的问题提供任何帮助。

最佳答案

我在构建过程中发现的问题和相应的解决方案:

1. 未定义的链接器问题,无法从 sdk_build 中找到依赖项。

解决方案:使用 CMakeLists.txt 的 find_package 中的 AWSSDK 来指导我们

find_package(AWSSDK REQUIRED COMPONENTS s3)

2. Cmake 构建错误,指出 Cmake 找不到 aws-sdk-cpp 文件,例如 aws-sdk-cpp-config.cmake、aws-c-event-stream-config.cmake。

解决方案:AWS SDK 查找二进制文件并包含 sdk_build 安装路径中的文件夹(按照 AWSSDKConfig.cmake) 。我们将在 ~/environment/CMakeLists.txt 中添加以下内容

set(AWSSDK_ROOT_DIR, "/usr/local/")

3. Cmake build 表明在安装 sdk_build 期间构建了共享库后,它正在寻找静态库。

解决方案:aws-sdk-cpp 中的 CMakeLists.txt 作为共享库构建到 sdk_build 中,看起来共享库标志在链接期间尚未打开,因此它会查找静态库,我们需要打开此功能

set(BUILD_SHARED_LIBS ON)
<小时/>

环境

AWS Linux Cloud 9
gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2)
GNU Make 3.82
cmake3 version 3.6.1

我用来构建的命令 C++ Sample :

安装所需的工具

sudo yum -y install gcc72 gcc72-c++
sudo yum -y install libcurl-devel openssl-devel libuuid-devel cmake3

在 home/ec2-user/environment/上构建项目

git clone https://github.com/aws/aws-sdk-cpp.git
cd aws-sdk-cpp
mkdir sdk_build
cd sdk_build
cmake3 .. -DBUILD_ONLY=s3
sudo make install
cd ..
create CMakeLists.txt and s3-demo.cpp here (see below)
cmake3 . 
make

在终端中测试可执行文件 s3-demo 的输出

./s3-demo my-test-bucket us-west-2
<小时/>

/home/ec2-user/environment/中所需的文件

s3-demo.cpp get your code in this link

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(s3-demo)
set(AWSSDK_ROOT_DIR, "/usr/local/")
set(BUILD_SHARED_LIBS ON)
find_package(AWSSDK REQUIRED COMPONENTS s3)
add_executable(s3-demo s3-demo.cpp)
target_link_libraries(s3-demo ${AWSSDK_LINK_LIBRARIES})

关于c++ - 与 AWS SDK 的链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59367331/

相关文章:

amazon-web-services - 是否可以在与 cloudformation 帐户不同的帐户中调用 lambda?

GCC 内置函数 - 2003 年与 2019 年的行为

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 在 Windows CE 6.0/Windows Mobile/Windows Embedded Compact 下使用 RapidXml 出现奇怪的异常

c++ - 简单的 HDF5 C++ 问题

c++ - 未签名的 WINAPI 函数的正确函数指针是什么?

mysql - AWS Lambda 在代码中间停止执行

amazon-web-services - 如何自动停止和启动 AWS EC2 实例

c - Xcode 链接器错误(重复符号),而 gcc 工作正常

C++ postfix++ 运算符重载