【问题标题】:Compiling pdftohtml binary for AWS-Lambda: GLIBC issues为 AWS-Lambda 编译 pdftohtml 二进制文件:GLIBC 问题
【发布时间】:2019-07-08 20:59:01
【问题描述】:

我正在尝试让 XPDF 的 pdftohtml 的 Lambda 快乐版本工作,但没有运气。

到目前为止,已经尝试了以下方法:

  • 已创建运行最新 amazonlinux 映像的 Docker 容器
  • 我已将源代码复制到此容器中并运行:

    yum 安装 cmake、gcc、gcc-c++、freetype-devel

  • 使用 cmake 编译代码会生成一个二进制文件,该二进制文件可以在容器中完美执行,该容器应该与 Lambda 具有相同的操作系统和环境。
  • 我已在容器中验证 libc.so.6 的版本为 2.26。
  • 我已将其复制到我的 AWS zip 文件夹中,并将以下依赖项包含在准备上传的 lib 文件夹中:

    libfreetype.so.6.10.0、libpng15.so.15、libstdc++.so.6.0.24

  • 这些依赖项直接从用于编译代码的容器中复制。
  • Python 函数然后通过

    连接这些

    os.environ.update(dict(LD_LIBRARY_PATH='/var/task/lib'))

  • 最后,我运行函数并得到以下错误代码:

    /var/task/pdftohtml: /lib64/libc.so.6: 找不到版本“GLIBC_2.18”(/var/task/lib/libstdc++.so.6 需要)

我不知道 GLIBC_2.18 来自哪里,因为这个版本不存在于用于编译它的容器中。

真的很难过,但很想完成它,因为它会生成一个非常适合 Lambda 函数的轻量级二进制文件!

我哪里错了?

编辑

已解决 - 请参阅下面的 cmets。 AWS Linux 和 Lambda 有两个版本运行this version

按照其中一位评论者的建议,我在 EC2 实例中运行。虽然 libstdc++.so.6.24 看起来是正确的版本,但由于它本身是使用不同的 GLIBC 版本编译的,但它会引发错误。从源代码在 EC2 中编译工作正常。另一个技巧是确保 CXX_FLAGS 包含 -std=c++11。感谢那些帮助我解决这个问题的人!

【问题讨论】:

  • 如果您遵循了官方的说明(例如使用gcc64),那么这听起来值得支持票。看起来他们的环境有问题。

标签: linux cmake compilation aws-lambda glibc


【解决方案1】:

我不知道 GLIBC_2.18 来自哪里,因为这个版本不存在于用于编译它的容器中。

我认为您不了解符号版本依赖关系(请参阅here)。

错误消息告诉您,您的libstdc++.so.6 是针对GLIBC-2.18或更新版本构建的,而您正在针对GLIBC-2.17或更旧版本运行。 p>

我哪里错了?

您的构建环境所针对的东西比您的部署环境所包含的要新得多。

您需要找到与您的部署目标相匹配的构建环境,或者您需要将您的部署目标更改为不比您的构建环境旧。

【讨论】:

  • 嗨@Employed Russian - 感谢您的回答和您的意见。我的困惑在于构建环境和部署环境是相同的——构建的 docker 映像和 AWS Lambda 部署环境都运行最新版本的 amazon linux。为了测试我不会无意中升级依赖项作为构建的一部分,我已经编译了一个二进制文件,然后旋转一个干净的图像并复制二进制文件和一些必需的 .so 文件(不是 包括 libstdc++ 或 libc) 并且它运行完美。一旦我在 AWS Lambda 上进行部署,我就遇到了问题
  • @lawson 只是一个想法,但根据docs.aws.amazon.com/lambda/latest/dg/…,Lambda 环境正在运行 amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2。它不是最新的 Amazon Linux 版本(即 Amazon Linux 2)。不确定您是否意外运行了 docker 映像(amazonlinux 指向 Amazon Linux 2,因此您需要将 amazonlinux:1 用于作为 Amazon Linux 1 的 docker 映像)。另外,也许可以在运行 Lambda 文档中的确切映像的 EC2 实例中编译?
  • @KaiYao - 你完全正确!我没有意识到还有一个不同的版本——Doh!我在一个 EC2 实例中编译,现在理解 EmployedRussian 的意思。旧 amazonlinux 中的 glibc 版本是 2.17,因此 libstdc++.so.6 的版本将使用与新 amazonlinux 中不同的 glib 进行编译。如果有人读到这篇文章并想要这样做,请更改 CMakeLists.txt 以运行兼容版本的 CMake (
猜你喜欢
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2013-01-03
  • 2017-07-29
相关资源
最近更新 更多