AWS SDK stati c linking: libcrypto.so.1.0.0: невозможно открыть общий объектный файл - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь собрать AWS SDK для c ++ со связью stati c, поэтому я могу использовать его как двоичный файл внутри AWS лямбда-функции.

Шаги, которые я предпринял, следующие:

  1. git клон https://github.com/aws/aws-sdk-cpp.git.
  2. mkdir build && cd build
  3. cmake .. -DBUILD_SHARED_LIBS = OFF -DBUILD_ONLY = "s3" -DENABLE_TESTING = OFF -DFORCE_SHARED_CRT = OFF (который создал lib aws - cpp -sdk-s3.a внутри aws - cpp -sdk-s3 каталог)
  4. Теперь мой исходный CMakeLists.txt выглядит следующим образом
cmake_minimum_required(VERSION 3.1)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE "Release")
project(executable LANGUAGES CXX)

add_executable(${PROJECT_NAME} "execute_code.cpp")

set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::Crypto)

set(aws-sdk-cpp_DIR "<path to aws-sdk-cpp/build>")
find_package(aws-sdk-cpp)

link_libraries(aws-cpp-sdk-core)

target_link_libraries(executable PRIVATE aws-cpp-sdk-s3 aws-cpp-sdk-core)

target_compile_features(${PROJECT_NAME} PRIVATE "cxx_std_11")
target_compile_options(${PROJECT_NAME} PRIVATE
    "-Wall"
    "-Wextra"
    "-Wconversion"
    "-Wshadow"
    "-Wno-sign-conversion")
#set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
include_directories(${PROJECT_SOURCE_DIR})

Я знаю, что AWS SDK для c ++ требует OpenSSL, и я добавил, что внутри CMakeLists и когда я запускаю make после команды Cmake , tt показывает

-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.a (found version "1.0.2g") 

, поэтому проект может найти stati c libcrypto. Но при развертывании на AWS лямбда выдает ошибку при загрузке общих библиотек: libcrypto.so.1.0.0: не удается открыть файл общих объектов: нет такого файла или каталога \ n .

Может кто-нибудь сказать мне, как мне отладить это или я что-то упустил? Я попытался найти его, но не смог найти ничего полезного для ссылки c.

Вот мой код_выпуска. cpp:

#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/Bucket.h>
#include<iostream>

int main(int argc, char** argv) {

  Aws::SDKOptions options;
  Aws::InitAPI(options);
  {
      // snippet-start:[s3.cpp.list_buckets.code]
      Aws::S3::S3Client s3_client;
      auto outcome = s3_client.ListBuckets();

      if (outcome.IsSuccess())
      {
          std::cout << "Your Amazon S3 buckets:" << std::endl;

          Aws::Vector<Aws::S3::Model::Bucket> bucket_list =
              outcome.GetResult().GetBuckets();

          for (auto const &bucket : bucket_list)
          {
              std::cout << "  * " << bucket.GetName() << std::endl;
          }
      }
      else
      {
          std::cout << "ListBuckets error: "
              << outcome.GetError().GetExceptionName() << " - "
              << outcome.GetError().GetMessage() << std::endl;
      }
      // snippet-end:[s3.cpp.list_buckets.code]
  }
  Aws::ShutdownAPI(options);

Также будет полезно, если кто-нибудь подскажет, как я могу развернуть разделяемые библиотеки на AWS lambda.

Редактировать: я смог решить эту проблему, используя Amazon Linux вместо Ubuntu.

...