在Ubuntu上使用cmake安装AWS SDK C++,安装第三方库时出现问题

4
我正在按照https://github.com/aws/aws-sdk-cpp上的安装说明,在Ubuntu 20.04中安装aws-cpp-sdk。按照指示从源代码构建/安装了SDK,安装位置分别为:/usr/local/lib和/usr/local/include/aws。我按照说明构建/安装了aws-c-common,尽管我没有使用DCMAKE_INSTALL_PREFIX。我试图构建aws-checksums,但无法通过cmake。当我在代码目录中的构建目录中运行cmake ..时,出现以下消息:
-- The C compiler identification is GNU 9.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
/usr/local/lib/cmake/lib/cmake
CMake Error at CMakeLists.txt:32 (include):
  include could not find load file:

    AwsCFlags

CMake Error at CMakeLists.txt:33 (include):
  include could not find load file:

    AwsCheckHeaders

CMake Error at CMakeLists.txt:34 (include):
  include could not find load file:

    AwsSharedLibSetup

CMake Error at CMakeLists.txt:35 (include):
  include could not find load file:

    AwsSanitizers

CMake Error at CMakeLists.txt:37 (include):
  include could not find load file:

    AwsFindPackage

CMake Error at CMakeLists.txt:38 (include):
  include could not find load file:

    AwsFeatureTests

CMake Error at CMakeLists.txt:116 (aws_set_common_properties):
  Unknown CMake command "aws_set_common_properties".

-- Configuring incomplete, errors occurred!
See also ...

我尝试将前缀指向sdk安装文件夹,但这并没有解决我的问题。那就是我卡住的地方。感谢任何意见。


看起来您已经在CMakeLists.txt中添加了一些message()调用,这个调用会打印出/usr/local/lib/cmake/lib/cmake这一行。这是AWS_MODULE_PATH变量的值,对吗?他们计算这个变量的方式相当奇怪。 似乎这个变量的值应该是/usr/local/lib/cmake。尝试直接在CMakeLists.txt中将变量设置为该值(并检查该目录是否包含AwsCFlags.cmake和其他.cmake脚本)。 - Tsyvarev
@Tsyvarev 感谢你的提示。你说得对,我必须更改前缀。cmake .. -DCMAKE_PREFIX_PATH=/usr/local/ -DCMAKE_INSTALL_PREFIX=/usr/local/ 尽管有些测试失败了。如果你想写一个答案,请继续,否则我应该删除这篇文章吗? - Janusz
我不想回答。我只能看到他们的CMakeLists.txt,据我理解,AWS_MODULE_PATH的计算是个问题。但是我不知道正确的方法。你可以回答你的问题并描述可行的方法。(虽然我们更喜欢“可行”与“正确”相同,但在现实生活中它们有时可能会有所不同:)) - Tsyvarev
4个回答

4

如果你正在编译源代码,请确保使用以下命令

git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp

我在构建过程中遇到了类似的问题,因为我缺少了--recurse-submodules标记。我是在运行Ubuntu的Docker容器内进行构建的。我的解决方案适用于AWS cpp SDK,但它也可能适用于您的情况。


谢谢,那真的帮了很大的忙。原来他们在1.7.x和1.9.x之间开始使用子模块,因此我们的脚本出了问题。 - n0ne

2

我在Dockerfile中进行了这个操作,并且它成功地运行了:

RUN cd /tmp \
  && git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp.git \
  && cd aws-sdk-cpp \
  && mkdir build \
  && cd build \
  && cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_ONLY="ecr" \
  && make \
  && make install

即使没有使用-DBUILD_ONLY选项,它也可以构建。但是,这是在Ubuntu 18.04 LTS上完成的,而不是20.04。然而,我不认为会有什么区别。

你没有说你正在给cmake提供哪些选项。


嗨,Joseph,感谢您的评论。我同意这是你的方式,但不完全是。正如我所提到的,我按照ReadMe进行了基本设置,这意味着在安装sdk期间我没有设置任何内容。为了使我能够运行基本的s3-sample,我需要安装sdk readme中概述的第三方依赖项。尽管aws-sdk-cpp Cmakelist is.txt默认指示选项BUILD_DEPS ON,但它们似乎并没有完全安装。也许我错过了某些设置。我愿意听取建议。 - Janusz
在克隆时,需要使用--recurse-submodules参数,否则cmake配置将无法工作(因此也无法构建)。 - tothphu
@tothphu 我认为原本不需要,但现在需要了。我更新了我的答案。 - Joseph Larson
--recurse-submodules 对我很有帮助。 - pogorman

1
我已创建一个演示应用程序s3-demo,可以获取特定区域中的存储桶列表。该项目可在github.com/unfor19/docker-aws-sdk-cpp上获得。
我也遇到了你所遇到的问题(以及更多其他问题),但最终我能够编写出一个Dockerfile来构建aws-sdk-cpp和演示应用程序。
这是我的Dockerfile
ARG AWS_SDK_CPP_VERSION="1.8.160"
ARG AWS_SDK_CPP_BUILD_TYPE="Release"
ARG APP_BUILD_TYPE="Release"

### -----------------------------------------------------
### Base image
### -----------------------------------------------------
FROM ubuntu:20.04 as base

# Fix tzdata hang
ENV TZ=Etc/UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN \
    apt-get update && \
    apt-get install -y \
    curl wget git zip unzip \
    cmake g++ gcc \
    libcurl4-openssl-dev libssl-dev libpulse-dev \
    uuid-dev zlib1g-dev

RUN apt-get update && \
    apt-get install -y \
    make golang-1.13

ENV PATH="$PATH:/usr/lib/go-1.13/bin"
COPY scripts/ /usr/local/bin/
WORKDIR /code/


### -----------------------------------------------------
### Build aws-sdk-cpp
### -----------------------------------------------------
FROM base as build-aws-sdk-cpp
ARG AWS_SDK_CPP_VERSION
ARG AWS_SDK_CPP_BUILD_TYPE
ENV AWS_SDK_CPP_VERSION="${AWS_SDK_CPP_VERSION}" \
    AWS_SDK_CPP_BUILD_TYPE="${AWS_SDK_CPP_BUILD_TYPE}"
WORKDIR /code/
RUN download.sh "https://github.com/aws/aws-sdk-cpp/archive/${AWS_SDK_CPP_VERSION}.zip"
WORKDIR /sdk_build/
RUN cmake /code/aws-sdk-cpp-${AWS_SDK_CPP_VERSION} -DBUILD_ONLY="s3" -DCMAKE_BUILD_TYPE="${AWS_SDK_CPP_BUILD_TYPE}"
RUN make && \
    make install && \
    rm -rf /code/


### -----------------------------------------------------
### Build the application
### -----------------------------------------------------
FROM build-aws-sdk-cpp as build-app
WORKDIR /code/
COPY . .
ARG APP_BUILD_TYPE
ENV APP_BUILD_TYPE="${APP_BUILD_TYPE}"
RUN rm -rf build && cmake -S . -B build -DCMAKE_BUILD_TYPE="${APP_BUILD_TYPE}"
WORKDIR /code/build/
RUN make
# Default region N.Virginia

0

我遇到了相同的问题,当我下载zip包时。后来我使用git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp获取源代码。那个方法很好用。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接