与AWS开发工具包链接问题

时间:2019-12-17 03:44:15

标签: 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 Cloud 9
  • gcc(GCC)7.2.1 20170915(Red Hat 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开发工具包代码:

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  

问题:

许多未定义的引用,下面是一个片段:

  • 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()的未定义引用
  • 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 个答案:

答案 0 :(得分:3)

在构建期间发现的问题和相应的解决方案:

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根据AWSSDKConfig.cmake查找二进制文件,并包含来自sdk_build安装路径的文件夹。我们将以下内容添加到〜/ environment / CMakeLists.txt中

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

3. Cmake构建指出,在安装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

在家庭/ ec2-user /环境/

上构建项目
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})
相关问题