#pytorch #linker-errors #libtorch
Вопрос:
Я не могу связать свою программу с pytorch под Linux, появляется следующая ошибка:
/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+cpu.zip и распаковал (так что у меня есть папка libtorch рядом с папкой с test.cpp).
Есть идеи, как решить эту проблему? Та же программа прекрасно работает под Visual C .
P.S. Я знаю, что pytorch отчасти разработан для cmake, но у меня нет опыта работы с cmake и нет желания писать систему сборки на основе cmake для моего приложения. Кроме того, примеры, которые они приводят, по-видимому, должны работать только в том случае, если pytorch «установлен» в системе. Значит, я не могу просто загрузить файл .zip с помощью библиотек? И если я «установлю» его (например, из источников или любым другим способом) в системе AVX512, будет ли двоичный файл, который я свяжу с ним и распространю конечным пользователям, работать не на AVX512? Документация совершенно непонятна новичкам.
ОБНОВЛЕНИЕ: Я попытался сделать это с помощью CMake, следуя инструкции https://pytorch.org/cppdocs/installing.html и получил точно такую же ошибку. В частности, я переименовал свой каталог в 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 дает тот же результат.
Ответ №1:
Это не ошибка, связанная с cmake, это просто то, как была реализована библиотека. Я не знаю почему, но, похоже, специализация T* at::Tensor::data<T> const
with T = long long
была забыта/опущена.
Если вы хотите получить подписанный 64-битный указатель, вы все равно можете получить его с помощью int64_t
:
auto data = T.data<int64_t>();
Рекомендуется использовать эти типы, для которых размер в целом является явным, чтобы избежать проблем с совместимостью.