【发布时间】: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)。