cmake-链接静态库pytorch在构建期间找不到其内部函数
我正在尝试使用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
/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的静态链接也经历了类似的过程,老实说,它并不太漂亮
我将概述我所采取的步骤(您可以在中找到确切的源代码,isCMakeLists.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