我正在尝试使用静态链接为 c++ 构建 AWS 开发工具包,因此我可以将其用作 AWS Lambda 函数中的二进制文件。
我采取的步骤如下:
- git 克隆https://github.com/aws/aws-sdk-cpp.git。
- mkdir 构建 && cd 构建
- cmake .. -DBUILD_SHARED_LIBS=OFF -DBUILD_ONLY="s3" -DENABLE_TESTING=OFF -DFORCE_SHARED_CRT=OFF (在 aws-cpp-sdk-s3 目录中创建了libaws-cpp-sdk-s3.a )
- 现在我的源 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 for c++ 需要 OpenSSL,我已经在 CMakeLists 中添加了它,当我在Cmake命令之后运行make时,tt 显示
-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.a (found version "1.0.2g")
所以项目能够找到静态 libcrypto。但是当我在 AWS lambda 上部署它时,它 在加载共享库时出现错误错误: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory\n。
谁能告诉我如何调试这个或者如果我遗漏了什么?我尝试搜索它,但找不到任何对静态链接有用的东西。
这是我的execute_code.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 机器上构建来解决这个问题。