使用AWS C ++ SDK的基本程序不会编译

时间:2016-05-12 09:48:13

标签: c++ amazon-s3 aws-sdk

由于严重缺乏文档,我使用AWS C ++ SDK遇到了一些麻烦。但是我设法在我的计算机上编译并安装它。

我现在努力让一个程序工作并解决了很多问题,但是(希望)最后一个仍然是我无法独自战胜......

以下是代码:

#include <aws/s3/model/GetObjectRequest.h>

int main()
{
     Aws::S3::Model::GetObjectRequest getObjectRequest;
}

我试图为我的例子提供最简单的代码。该代码无法编译,我收到了以下错误:

CMakeFiles/example.dir/example.cpp.o:(.rodata._ZTIN3Aws2S39S3RequestE[_ZTIN3Aws2S39S3RequestE]+0x10): undefined reference to `typeinfo for Aws::AmazonSerializableWebServiceRequest'

我不知道问题所在。我尝试检查库的源代码,GetObjectRequest类中没有纯虚函数。我想我正确地链接了库。这是我的CMakeLists.txt:

project( TEST_AWS )
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
add_definitions ( -Wall -Wextra )

set(LIBAWSSDK_INCLUDE_DIR /usr/local/include/ CACHE STRING "aws SDK include directories")
set(LIBAWSSDK_CORE_LIB "-l:/usr/local/lib/libaws-cpp-sdk-core.so" CACHE STRING "aws SDK core link lib")
set(LIBAWSSDK_S3_LIB "-l:/usr/local/lib/libaws-cpp-sdk-s3.so" CACHE STRING "aws SDK S3 link lib")

set(target_external_libraries
    ${LIBAWSSDK_CORE_LIB}
    ${LIBAWSSDK_S3_LIB}
)

include_directories(
    ${LIBAWSSDK_INCLUDE_DIR}
)

add_executable( example example.cpp )
target_link_libraries( example ${target_external_libraries} )
target_compile_features(example PRIVATE cxx_lambdas)

我知道我用cmake链接库的方式有点脏,但目前我只想编译代码......

2 个答案:

答案 0 :(得分:0)

如果您使用的是CMake,我建议您使用SDK中的cmake导出文件,以避免弄清楚我们使用的是什么。 https://aws.amazon.com/blogs/developer/using-cmake-exports-with-the-aws-sdk-for-c/

-fno-rtti标志将被删除并更改为可选的CMake标志。

如果您使用CMake导出,它将正确生成您的Visual Studio解决方案。

更新:

已使用最新版本

修复此问题

答案 1 :(得分:0)

  • 非常重要:如果您正在使用RTTI(-frtti)进行编译,请确保您的依赖库也使用它进行编译,而不是-fno-rtti。否则,在子类化使用-fno-rtti编译的类或使用dynamic_cast时,将获得typeinfo错误。 (C++: what are the causes of " undefined reference to 'typeinfo for [class name]' "other than virtual functions

  • 所以,-fno-rtti只有在你编译aws-sdk时才有效

  • 现在,在大多数情况下,您将使用许多其他库来编译aws-sdk。大多数库,opencv等都是用-frtti编译的。如果用-fno-rtti编译aws-sdk,那么你将得到上面的typeinfo madness错误

  • 解决方案:查看最新的aws-sdk-cpp(截至6月1日)。它使用-frtti选项..然后链接它,生活是好的