CMake编译LibTorch项目头文件<torch/torch.h>找不到问题求助
问题原因
- 核心是CMake依赖传递的可见性配置错误:你在
load_data库的CMakeLists.txt中,将Torch依赖设为了PRIVATE链接。这种配置下,Torch的头文件路径只会在编译load_data自身的源文件(.cpp)时生效,不会传递给依赖load_data的其他目标,也不会暴露给load_data公开头文件的使用者。 - 当你把
#include <torch/torch.h>写在load_data的公开头文件中时,编译main.cpp需要预处理这个头文件,此时main目标没有Torch的头文件搜索路径,就会报找不到文件的错误。 - 把include语句移到
.cpp文件后,只有编译load_data自己的源文件时会用到Torch头文件,此时私有配置的路径生效,就不会报错。
解决方案
根据你的业务需求二选一即可:
方案一:头文件需要暴露Torch相关类型
如果你的load_data公开头文件需要用到Torch的类型(比如你注释掉的torch::Tensor rand_tensor()接口),直接修改load_data/CMakeLists.txt的链接配置,将Torch依赖改为PUBLIC:
# 修改前 # target_link_libraries(${LIB_NAME} # PRIVATE # ${TORCH_LIBRARIES} # ) # 修改后 target_link_libraries(${LIB_NAME} PUBLIC ${TORCH_LIBRARIES} )
该配置会将Torch的头文件路径、编译选项自动传递给所有链接load_data的目标,编译main.cpp时就可以找到Torch头文件。
方案二:头文件不需要暴露Torch相关类型
如果Torch只是load_data的内部实现依赖,不需要对外暴露,直接将#include <torch/torch.h>从公开头文件移到.cpp源文件中即可,不需要修改CMake配置,这种方式也更符合封装原则,不会对外传递不必要的依赖。
额外优化建议
- 删除
load_data/CMakeLists.txt中重复添加的${PROJECT_SOURCE_DIR}/src/load_data.cpp源文件配置,避免冗余。 - 根目录已经执行过
find_package(Torch REQUIRED),子目录不需要重复执行find操作,可删除冗余配置。 - 不需要手动修改
CMAKE_CXX_FLAGS添加${TORCH_CXX_FLAGS},链接Torch目标时相关编译选项会自动传递。
内容的提问来源于stack exchange,提问作者Green
相关产品推荐
相关产品推荐

