Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cmake-链接静态库pytorch在构建期间找不到其内部函数_Cmake_Pytorch_Static Libraries_Static Linking_Libtorch - Fatal编程技术网

cmake-链接静态库pytorch在构建期间找不到其内部函数

cmake-链接静态库pytorch在构建期间找不到其内部函数,cmake,pytorch,static-libraries,static-linking,libtorch,Cmake,Pytorch,Static Libraries,Static Linking,Libtorch,我正在尝试使用cmake构建一个程序。出于几个原因,必须使用静态库而不是动态库来构建程序,我需要使用PyTorch,所以这就是我所做的: 下载并安装了PyTorch静态库(我在/home/me/PyTorch/torch/lib的正确路径中找到了libtorch.a) 使用以下内容制作CMakeLists.txt: 仅供参考,example app.cpp是带有主函数的文件,argparse/是一个目录,其中包含一些在example app.cpp中调用的函数的源代码 它一直工作到cmake-D

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

  • 下载并安装了PyTorch静态库(我在
    /home/me/PyTorch/torch/lib
    的正确路径中找到了
    libtorch.a
  • 使用以下内容制作
    CMakeLists.txt
  • 仅供参考,
    example app.cpp
    是带有主函数的文件,
    argparse/
    是一个目录,其中包含一些在
    example app.cpp中调用的函数的源代码

    它一直工作到
    cmake-DCMAKE\u PREFIX\u PATH=/home/me/pytorch/torch..
    ,但是下面的
    build
    产生了一些错误,表示它找不到对某些函数的引用,即以
    fbgemm::
    开头的函数
    fbgemm
    是(据我所知)用于实现PyTorch的某种GEMM库

    在我看来,在链接静态PyTorch库时,它的内部库(如
    fbgemm
    之类)没有正确链接,但我不是
    cmake
    方面的专家,老实说,我也不完全确定

    我是做错了什么,还是有解决这个问题的办法?我们将非常感谢您向正确方向提供的任何帮助或推动

    p.S.

  • 确切的错误还没有公布,因为它太长了,但它主要由~
  • 错误的
    未定义引用组成。如果查看错误消息可能对某些人有所帮助,我很乐意编辑问题并发布它

  • build
    如果我从代码中删除了需要库函数的部分,而没有注释掉
    #包含
    example app.cpp中的
    ,那么编译和运行文件就可以了


  • 最近,Pytork的静态链接也经历了类似的过程,老实说,它并不太漂亮

    我将概述我所采取的步骤(您可以在中找到确切的源代码,is
    CMakeLists.txt
    (它还包括AWS SDK和AWS Lambda静态构建),is从源代码构建脚本
    pytorch
    (通过
    /scripts/build\u mobile.sh克隆和构建,仅支持CPU)),
    虽然它只支持CPU(虽然如果您需要CUDA,类似的步骤应该可以,但至少可以让您开始)

    Pytorch静态库 预建静电喷灯 首先,您需要预构建的静态库文件(所有文件都需要是静态的,因此没有
    。因此
    ,只有扩展名为
    .a
    的文件才合适)

    Tbh我一直在寻找由上的
    PyTorch
    提供的,但是只有
    共享的
    版本。
    在一期GitHub中,我找到了一种下载它们的方法,如下所示:

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

    $ wget https://download.pytorch.org/libtorch/cu101/libtorch-shared-with-deps-1.4.0.zip
    
    您将
    shared
    重命名为
    static
    (如上所述),因此它将变成:

    $ wget https://download.pytorch.org/libtorch/cu101/libtorch-static-with-deps-1.4.0.zip
    
    然而,当您下载它时,在
    lib
    文件夹下没有
    libtorch.a
    (也没有找到
    libcaffe2.a
    ,如所示),所以我剩下的是从源代码显式构建的

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

    从源头上建设 对于我使用的CPU版本文件,如果需要GPU支持,您可以基于此版本(可能您只需将
    -DUSE_CUDA=ON
    传递给此脚本,但不确定)

    最重要的是
    cmake
    -DBUILD\u SHARED\u LIBS=OFF
    ,以便将所有内容构建为
    静态库。您还可以检查将参数传递给
    build\u mobile.sh
    的参数

    在默认情况下,运行上述命令将为您提供
    /pytorch/build\u mobile/install
    中的静态文件,其中包含您需要的所有内容

    克马克 现在,您可以将上述构建文件复制到
    /usr/local
    (除非您使用
    Docker
    作为
    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}")
    
    现在,除了
    target\u link\u libraries
    ,其余的都很好,它们应该(如所示,请参阅此处列出的相关问题以获取更多参考)与
    -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
    ${CMAKE_DL_LIBS}
    ,尽管我在构建时需要它

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

    mkdir build && \
      cd build &&  \
      cmake .. && \
      cmake --build . --config Release
    
    上面将创建
    build
    文件夹,其中
    example app
    二进制文件现在应该安全地位于该文件夹中


    最后,使用
    ld build/example app
    验证
    PyTorch
    中的所有内容都是静态链接的,请参见第
    5点。
    ,您的输出应该是相似的。

    我实际上已经完成了前两个步骤(获取静态库)中的所有操作,如果有机会,我将尝试其余两个步骤!这个问题已经有两周没有解决了,非常感谢!我会让你随时更新。@WannabeArchitect有什么更新吗?还有一点好奇的是,您是否找到了更好/更有效的解决方案(不需要
    --整个归档文件
    链接器标志的解决方案)。实际上,我已经决定重新开始,现在在构建下载的libtorch存储库时出现了构建错误。我正在遵循
    pytorch/pytorch/README.md
    pytorch/pytorch/libtorch.rst
    中的规则(我很确定上次尝试时它是有效的)。。。我无法按照您的指示“从源代码构建”,因为您提供的脚本似乎是
    mkdir build && \
      cd build &&  \
      cmake .. && \
      cmake --build . --config Release