файл ‘torch/torch.h’ не найден в файле заголовка

#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 .