Pytorch张量::数据;朗朗>;()不在Linux上工作
我无法在Linux下将我的程序链接到pytorch,出现以下错误:Pytorch张量::数据;朗朗>;()不在Linux上工作,pytorch,linker-errors,libtorch,Pytorch,Linker Errors,Libtorch,我无法在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
/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'
Pytorch已从链接下载并解压缩(因此我将libtorch文件夹放在test.cpp文件夹旁边)
有没有办法解决这个问题?在Visual C++环境下,程序运行良好。
另外,我知道pytorch是为cmake设计的,但我对cmake没有任何经验,也不想为我的应用程序编写基于cmake的构建系统。此外,他们给出的示例似乎只在系统中“安装”了pytorch的情况下才有效。所以我不能直接用libs下载.zip?如果我在AVX512系统上“安装”它(例如,从源代码或以任何其他方式),我链接到它并分发给最终用户的二进制文件会在非AVX512上工作吗?这些文档对于新手来说是完全不可理解的
更新:我试图通过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)
然后
以下是输出:
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'
cmakfiles/example app.dir/example app.cpp.o:在函数'long long*at::Tensor::data()const'中:
示例app.cpp:(.text._ZNK2at6Tensor4dataIxEEPT_v[_ZNK2at6Tensor4dataIxEEPT_v]+0x14):未定义对“long long*at::Tensor::data_ptr()const”的引用
让我想,也许我忘了包含一些标题或定义一些变量?
哦,这些都是在Mint19.2(相当于Ubuntu18.04)上实现的,g++版本是7.5.0,glibc版本是2.27。使用g++-8编译会得到相同的结果。这不是与cmake相关的错误,而是库的实现方式。我不知道为什么,但似乎忘记了/省略了
T*at::Tensor::data const
与T=long
的专门化
如果要获取签名的64位指针,仍然可以使用int64\t
获取:
auto data = T.data<int64_t>();
auto data=T.data();
为了避免兼容性问题,最好使用这些大小通常是显式的类型
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'
auto data = T.data<int64_t>();