#c #cmake #pytorch #libtorch
Вопрос:
Я новичок в программировании на Linux C . Я должен использовать libtorch (версия pytorch C ), но я продолжал бороться с проблемами C и cmake. Эти проблемы действительно сводят меня с ума, и мне нужна помощь.
Вот простой проект на C :
.
├── build.sh
├── CMakeLists.txt
├── load_data
│ ├── CMakeLists.txt
│ ├── include
│ │ └── load_data
│ │ └── load_data.hpp
│ └── src
│ └── load_data.cpp
└── src
└── main.cpp
Но я не могу его построить, потому load_data/include/load_data/load_data.hpp
что не могу #include <torch/torch.h>
.
Сообщение об ошибке сборки:
[build] /my/path/load_data/include/load_data/load_data.hpp:4:10: fatal error: 'torch/torch.h' file not found
[build] #include <torch/torch.h>
[build] ^~~~~~~~~~~~~~~
Однако, если я перемещу #include <torch/torch.h>
файл заголовка из файла в соответствующий исходный файл, сообщение об ошибке исчезнет. Это приводит меня в замешательство.
Содержимое файлов:
load_data/include/load_data/load_data.hpp
#pragma once #include <torch/torch.h> namespace load_data { void try_torch(); // torch::Tensor rand_tensor(); }
load_data/src/load_data.cpp
# include "load_data/load_data.hpp" // If I remove it from load_data.hpp and use it here, the error goes away. // #include <torch/torch.h> namespace load_data { void try_torch(){ torch::Tensor tensor = torch::rand({2, 3}); std::cout << tensor << std::endl; } }
src/main.cpp
#include <string> #include "load_data/load_data.hpp" int main(int argc, char **argv) { load_data::try_torch(); return 0; }
CMakeLists.txt
cmake_minimum_required (VERSION 3.21) set(CMAKE_CXX_COMPILER clang -13) project(ldt-cpp-experiments VERSION 1.0.0 LANGUAGES CXX) find_package(Torch REQUIRED) message(STATUS "Torch_FOUND: ${Torch_FOUND}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}") add_subdirectory("load_data") set(EXECUTABLE_NAME main) add_executable(${EXECUTABLE_NAME} src/main.cpp) target_link_libraries(${EXECUTABLE_NAME} PRIVATE load_data ) set_target_properties(${EXECUTABLE_NAME} PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED YES )
load_data/CMakeLists.txt
cmake_minimum_required(VERSION 3.21) project (load_data VERSION 1.0.0 LANGUAGES CXX) find_package(Torch REQUIRED) message(STATUS "Torch_FOUND: ${Torch_FOUND}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}") set(LIB_NAME "load_data") add_library(${LIB_NAME} SHARED ) target_sources(${LIB_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/src/load_data.cpp ) target_sources(${LIB_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/src/load_data.cpp ${PROJECT_SOURCE_DIR}/include/load_data/load_data.hpp ) target_include_directories(${LIB_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/include ) target_link_libraries(${LIB_NAME} PRIVATE ${TORCH_LIBRARIES} ) set_target_properties(${LIB_NAME} PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED YES )
build.sh
cmake -S . -B build
Комментарии:
1. Вы забыли использовать
TORCH_INCLUDE_DIRS
переменную, которая обозначает каталоги включения для Tourch.2. @Tsyvarev Большое вам спасибо за ответ на мой вопрос. И я решил свою проблему, добавив эту переменную в
target_include_directories
.