cmake - 链接静态库 pytorch 在构建过程中找不到其内部函数

2023-12-26

我正在尝试使用 cmake 构建一个程序。由于多种原因,必须使用静态库而不是动态库构建程序,并且我需要使用 PyTorch,所以这就是我所做的:

  1. 下载并安装 PyTorch 静态库(我发现libtorch.a在正确的道路上,在/home/me/pytorch/torch/lib)
  2. Made CMakeLists.txt包含以下内容:
cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)
project(example-app LANGUAGES CXX)
find_package(Torch REQUIRED)
add_executable(example-app example-app.cpp argparse/argparse.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}" -static -fopenmp)
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

FYI, example-app.cpp是具有 main 功能的文件,并且argparse/是一个目录,其中包含一些调用函数的源代码example-app.cpp

它一直有效直到cmake -DCMAKE_PREFIX_PATH=/home/me/pytorch/torch ..,但以下build发生一些错误,说它找不到对某些函数的引用,即以fbgemm::. fbgemm是(据我所知)用于实现 PyTorch 的某种 GEMM 库。

在我看来,在链接静态 PyTorch 库时,其内部库如下fbgemm东西没有正确链接,但我不是这方面的专家cmake老实说并不完全确定。

我做错了什么吗,或者这个问题有解决方法吗?任何帮助或推动正确的方向将不胜感激。

P.S.

  1. 确切的错误尚未发布,因为它太长了,但它主要由undefined reference to ~错误。如果查看错误消息可能对某些人有帮助,我很乐意编辑问题并发布它。

  2. build如果我从代码中删除需要库函数的部分,则编译和运行文件可以正常工作without注释掉#include <torch/torch.h> from example-app.cpp.


最近使用 PyTorch 的静态链接经历了类似的过程,说实话,它不太漂亮。

我将概述我已采取的步骤(您可以在以下位置找到确切的源代码)火炬拉姆达 https://github.com/szymonmaszke/torchlambda, here https://github.com/szymonmaszke/torchlambda/blob/c70d3ea956972965e2bfe7a33213f9f6ba814972/src/CMakeLists.txt is CMakeLists.txt(它还包括 AWS SDK 和 AWS Lambda 静态构建),here https://github.com/szymonmaszke/torchlambda/blob/c70d3ea956972965e2bfe7a33213f9f6ba814972/src/dependencies/torch.sh是一个脚本建筑pytorch从源头(通过克隆和构建/scripts/build_mobile.sh仅CPU支持)), 尽管它仅支持 CPU(尽管如果您需要 CUDA,类似的步骤应该没问题,但它至少可以帮助您入门)。

Pytorch静态库

预构建的静态 PyTorch

首先,您需要预先构建的静态库文件(all其中需要是静态的,因此没有.so,只有那些有.a扩展是合适的)。

老实说,我一直在寻找那些提供的PyTorch on 安装页面 https://pytorch.org/get-started/locally/,但只有shared版本。 在一个 GitHub 问题中,我找到了一种下载它们的方法,如下所示:

而不是下载(此处通过wget)共享库:

$ wget https://download.pytorch.org/libtorch/cu101/libtorch-shared-with-deps-1.4.0.zip

你重命名shared to static(如所描述的在这个问题上 https://github.com/pytorch/pytorch/issues/25699#issuecomment-528389300),所以它会变成:

$ wget https://download.pytorch.org/libtorch/cu101/libtorch-static-with-deps-1.4.0.zip

然而下载后却没有libtorch.a under lib文件夹(没找到libcaffe2.a要么如所示这个问题 https://github.com/pytorch/pytorch/issues/20742),所以我剩下的就是从源代码中显式构建。

如果您以某种方式拥有这些文件(如果有,请提供您从何处获取它们),您可以跳过下一步。

从源头构建

对于我用过的CPU版本/pytorch/scripts/build_mobile.sh https://github.com/pytorch/pytorch/blob/master/scripts/build_mobile.sh文件,如果需要 GPU 支持,您可以以此为基础构建您的版本(也许您只需通过-DUSE_CUDA=ON到这个脚本,但不确定)。

最重要的是cmake's -DBUILD_SHARED_LIBS=OFF为了将一切构建为static图书馆。您还可以检查来自我的工具的脚本 https://github.com/szymonmaszke/torchlambda/blob/c70d3ea956972965e2bfe7a33213f9f6ba814972/src/dependencies/torch.sh它将参数传递给build_mobile.sh以及。

运行上面会给你静态文件/pytorch/build_mobile/install默认情况下,那里有您需要的一切。

CMake

现在您可以将上面的构建文件复制到/usr/local(最好不要这样做,除非您正在使用Docker as torchlambda)或从您的内部设置它的路径CMakeLists.txt像这样:

set(LIBTORCH "/path/to/pytorch/build_mobile/install")

# Below will append libtorch to path so CMake can see files
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${LIBTORCH}")

现在剩下的都很好except target_link_libraries,这应该是(如这个问题 https://github.com/pytorch/pytorch/issues/21737,请参阅那里列出的相关问题以获取更多参考)与-Wl,--whole-archive链接器标志,这让我想到了这一点:

target_link_libraries(example-app PRIVATE -lm
        -Wl,--whole-archive "${TORCH_LIBRARIES}"
        -Wl,--no-whole-archive
        -lpthread
        ${CMAKE_DL_LIBS})

您可能不需要其中任何一个-lm, -lpthread or ${CMAKE_DL_LIBS},尽管我在构建时需要它亚马逊 Linux AMI https://aws.amazon.com/amazon-linux-ami/.

Building

现在您可以开始构建您的应用程序了。标准libtorch方式应该没问题,但这是我使用的另一个命令:

mkdir build && \
  cd build &&  \
  cmake .. && \
  cmake --build . --config Release

以上将创建build文件夹在哪里example-app二进制文件现在应该已安全定位。

最后使用ld build/example-app验证一切PyTorch是静态链接的,请参阅上述问题 https://github.com/pytorch/pytorch/issues/21737 point 5.,您的输出应该看起来类似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake - 链接静态库 pytorch 在构建过程中找不到其内部函数 的相关文章

随机推荐

  • 如何保护database.yml?

    在 Ruby on Rails 应用程序中 database yml 是一个存储数据库凭据的纯文本文件 当我部署 Rails 应用程序时 我的 Capistrano 中有一个部署后回调 在应用程序的 config 目录中创建到 databa
  • 如何在Ubuntu中生成核心转储文件[重复]

    这个问题在这里已经有答案了 我想知道如何在 Ubuntu 中生成核心转储文件 我使用的是 Ubuntu 8 04 1 和 gcc 编译器 4 2 3 我编写了一个简单的 C 程序来生成核心转储 我已经编译了该程序 如 gcc g badpo
  • 从 StructureMap 获取的 HttpContext 上的空用户

    好吧 我之前的问题 设置有太多变量 所以我将其精简为最基本的组件 给出使用 StructureMap3 的以下代码 IoC setup For
  • 回发或回调参数无效。为什么?

    所以我得到了例外 回发或回调参数无效 使用启用事件验证 在配置或 在 页 出于安全目的 这 功能验证参数 回发或回调事件发起 从服务器控制 最初渲染它们 如果数据 是有效且预期的 使用 ClientScriptManager Registe
  • libreoffice 大量文本颜色更改

    有没有办法更改 LibreOffice 或 Openoffice 中文本中所有出现的特定颜色 是 光标位于find box hit more options 在里面Search Replace对话 点击 Format select Font
  • 如何在Windows 7中设置Python路径[重复]

    这个问题在这里已经有答案了 我尝试在 Windows 7 中设置 python 的路径 但我不能这样做 我去 My Computer gt Properties gt Advanced gt Environment Variables 但我
  • 使用空格而不是制表符进行缩进的客观原因是什么?

    根据 PSR 2 标准使用空格而不是制表符来缩进文件是否有客观原因 有人可以提供 facts 参考 具体的专业知识 PSR 2 标准基于哪个 PSR 2 标准的作者考虑的不仅仅是 外观和感觉 不仅仅是基于意见的东西 而且很多人很难理解为什么
  • 将 Excel 导入 Rails 应用程序

    我正在创建一个供个人使用的小型 Rails 应用程序 并且希望能够上传 Excel 文件以便稍后进行验证并添加到数据库中 我之前曾对 csv 文件进行过此操作 但此后这已变得不切实际 有谁知道使用 roo 或电子表格 gem 上传文件 向用
  • 带颜色编码的 vb.net/C# 代码编辑器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何带有颜色编码的 winforms 源代码编辑器控件 首选 开源 我好像记得以前遇到过类似的事情
  • PHP套接字服务器,检查客户端是否还活着

    我有一个 php 服务器正在监听 1 个 c 客户端 当连接建立后 它会一直保持活动状态 直到客户端发送 退出 命令来终止 PHP 服务器 但是 当 C 客户端在没有 退出 命令 即 单击 Windows 窗体中的关闭 x 按钮 的情况下断
  • 要包含或包含自动生成的依赖项?

    我喜欢用g MM自动构建我的依赖项的功能 我这样做的方法如下 include ALLOBJ o d d cxx echo making dependencies for lt g MM CXXFLAGS lt o sed i s o g 基
  • 分配时出现 JPEG 错误 #42

    为什么我不能直接将 MemoryStream 分配给图片 下面我发布了两种将 MemoryStream 分配给 TImage 的方法 方法 1 不起作用 方法 2 起作用 为什么 谢谢 山姆 方法 1 此方法返回 JPEG 错误 42 Va
  • jax-ws webservice 的端点始终是 localhost

    我真的需要你的帮助 我读到 jax ws web 服务的 wsdl 将为每个请求动态生成 这样 soap 端点等地址将被调整为请求 url 就我而言 无论是内部请求还是外部请求 地址始终引用 localhost 8080 某人知道我该如何处
  • C++ Linux 最快的时间测量方法(比 std::chrono 更快)?包含基准

    include
  • 为大型 URI 配置 Nginx

    我有一个很大的 URI 我正在尝试配置 Nginx 来接受它 URI参数长度为52000个字符 大小为52kb 我尝试过在没有 Nginx 的情况下访问 URI 效果很好 但是当我使用 Nginx 时 它给了我一个错误 414 请求 URI
  • 如何生成 3 列列表?

    我必须生成一个 3 列的项目列表 类似于此页面上不同群体 主要是银行和金融机构 可以看到的内容 http funds ft com FundDirectory aspx http funds ft com FundDirectory asp
  • 如何将 RDF 文件导入 Apache Solr

    我是 Apache Solr 的新手 我想将 rdf 文件导入 solr 进行索引 我用 google 搜索了它 但没有找到任何有用的东西 请给我一些指示 Solr 接受 JSON 文档 您可以将 RDF 文档转换为JSON LD http
  • 在 Spark mapPartitions 中使用 Java 8 并行流

    我试图了解 Spark 并行性中 Java 8 并行流的行为 当我运行下面的代码时 我期望输出大小为listOfThings与输入大小相同 但事实并非如此 我的输出中有时会缺少一些项目 这种行为并不一致 如果我只是遍历迭代器而不是使用par
  • scala:将 null 分配给原语

    我试图将 null 分配给一个 Double 变量 如下所示 var foo 0 0 foo null 但是 这会出现 null 无法隐式转换为 Double 的错误 所以我这样做 foo null asInstanceOf Double
  • cmake - 链接静态库 pytorch 在构建过程中找不到其内部函数

    我正在尝试使用 cmake 构建一个程序 由于多种原因 必须使用静态库而不是动态库构建程序 并且我需要使用 PyTorch 所以这就是我所做的 下载并安装 PyTorch 静态库 我发现libtorch a在正确的道路上 在 home me