【问题标题】:Basic program using AWS C++ SDK won't compile使用 AWS C++ SDK 的基本程序无法编译
【发布时间】:2016-05-12 09:48:13
【问题描述】:

由于严重缺乏文档,我在使用 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 链接的方式有点脏,但目前我只想编译代码...

【问题讨论】:

  • 据我所见,您的代码可以编译,但链接器会报错(example.cpp.o 目标文件中报告了错误)。
  • 是的,我只是将链接视为编译过程的一部分。这显然是一个链接问题,但我不明白,因为我链接了正确的库(我认为)。
  • 那么,虽然你知道“我链接库的方式一点都不好”,但你仍然希望它能够正确构建吗?这很难。我不确定您使用的是哪个工具集,但由于错误指向缺少 typeinfo 很可能没有链接正确的静态库(并且您需要它来构建应用程序),其中包含代码中声明的符号定义(例如 @987654321 @ 或 stackoverflow.com/questions/8951884/…)。
  • 当我说我的链接“一点都不好”时,我的意思是这不是干净的方法(直接在 CMakeLists.txt 中的绝对路径),我并不是说它不应该工作。我想我链接了正确的静态库,或者如果我错了,我看不出我的错误是什么,因此这篇文章。
  • 好的,我明白了。我在 Windows 上进行 c++ 开发,因此无法提供详细信息,但通常有一个工具可用于检查链接的库是否真的包含符号(例如,在 win 上我使用 dumpbin)。

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


【解决方案1】:
  • 非常重要:如果您使用 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 编译的。如果 aws-sdk 用 -fno-rtti 编译,那么你会得到上面的 typeinfo madness 错误

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

【讨论】:

    【解决方案2】:

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

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

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

    更新:

    最新版本已修复此问题

    【讨论】:

    • 0.12.4 没有可用作可选 CMake 标志的 no-rtti
    • @blueether 0.12.5 已更新为可选标志
    猜你喜欢
    • 2013-03-06
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多