【发布时间】:2021-05-18 10:57:51
【问题描述】:
Linux下无法链接我的程序到pytorch,出现如下错误:
/tmp/ccbgkLx2.o: In function `long long* at::Tensor::data<long long>() const':
test.cpp:(.text._ZNK2at6Tensor4dataIxEEPT_v[_ZNK2at6Tensor4dataIxEEPT_v]+0x14): undefined reference to `long long* at::Tensor::data_ptr<long long>() const'
我正在构建一个非常简单的最小示例:
#include "torch/script.h"
#include <iostream>
int main() {
auto options = torch::TensorOptions().dtype(torch::kInt64);
torch::NoGradGuard no_grad;
auto T = torch::zeros(20, options).view({ 10, 2 });
long long *data = (long long *)T.data<long long>();
data[0] = 1;
return 0;
}
用于构建它的命令:
g++ -w -std=c++17 -o test-torch test.cpp -D_GLIBCXX_USE_CXX11_ABI=1 -Wl,--whole-archive -ldl -lpthread -Wl,--no-whole-archive -I../libtorch/include -L../libtorch/lib -ltorch -ltorch_cpu -lc10 -Wl,-rpath,../libtorch/lib
Pytorch 已从链接 https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.7.0%2Bcpu.zip 下载并解压缩(所以我在 test.cpp 文件夹旁边有 libtorch 文件夹)。
任何想法如何解决这个问题?同样的程序在 Visual C++ 下也能正常运行。
附:我知道 pytorch 是为 cmake 设计的,但我对 cmake 的经验为零,也不想为我的应用程序编写基于 cmake 的构建系统。此外,他们提供的示例似乎只在系统中“安装”了 pytorch 时才有效。所以我不能只下载带有库的 .zip 吗?如果我在 AVX512 系统上“安装”它(例如从源代码或以任何其他方式),我链接到它并分发给最终用户的二进制文件是否可以在非 AVX512 上工作?文档对于新手来说是完全无法理解的。
更新:我尝试按照教程https://pytorch.org/cppdocs/installing.html 通过 CMake 执行此操作,并得到完全相同的错误。具体来说,我将我的目录重命名为 example-app,并将源文件重命名为 example-app.cpp。然后我在这个目录中创建了 CMakeLists.txt,内容如下:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
然后
mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=../../libtorch ..
cmake --build . --config Release
这是输出:
CMakeFiles/example-app.dir/example-app.cpp.o: In function `long long* at::Tensor::data<long long>() const':
example-app.cpp:(.text._ZNK2at6Tensor4dataIxEEPT_v[_ZNK2at6Tensor4dataIxEEPT_v]+0x14): undefined reference to `long long* at::Tensor::data_ptr<long long>() const'
让我想,也许我忘了包含一些标题或定义一些变量? 哦,这都是在 Mint 19.2(相当于 Ubuntu 18.04)上,g++ 版本是 7.5.0,glibc 是 2.27。用 g++-8 编译得到同样的结果。
【问题讨论】:
标签: pytorch linker-errors libtorch