使用CMake编译CUDA项目遇tuple模板参数错误,求兼容解决方案
解决libtorch 1.12.0 + CUDA 11.3编译PointConv时的模板参数不匹配错误
问题描述
编译基于libtorch 1.12.0(搭配CUDA 11.3)的PointConv CUDA项目时,CMake配置正常,但编译main.cpp失败,核心报错为tuple... error: wrong number of template arguments,其余错误均为类似的模板参数数量不匹配问题。
项目结构
| (root) | main.cpp | CMakeLists.txt ----| (_ext) ----| CMakeLists.txt --------| (src) --------| group_points_gpu.cu --------| group_points.cpp --------| CMakeLists.txt --------| (include) --------| group_points.h ----| (libtorch) ----| ...(省略)
CMake配置
根目录CMakeLists.txt
############ CMakeLists.txt in root dir ############ cmake_minimum_required (VERSION 3.23.0) set(CMAKE_C_COMPILER "/usr/bin/gcc-7") # compiler set(CMAKE_CXX_COMPILER "/usr/bin/g++-7") set(CMAKE_CXX_STANDARD 11) # standard project (PointConv LANGUAGES CXX CUDA) add_executable(PointConv main.cpp) target_compile_features(PointConv PUBLIC cxx_std_11) set_target_properties(PointConv PROPERTIES CUDA_SEPARABLE_COMPILATION ON) # include include_directories("libtorch/include/") include_directories("libtorch/include/torch/csrc/api/include/") include_directories("/data_HDD/zhuxingyu/anaconda3/envs/p11/include/python3.8/") include_directories("${PROJECT_SOURCE_DIR}/_ext/include") # subdir add_subdirectory(_ext) target_link_libraries(PointConv _ext) file(GLOB LIBTORCH_LIBS "libtorch/lib/*.a" "libtorch/lib/*.so") target_link_libraries(PointConv ${LIBTORCH_LIBS})
_ext/src目录CMakeLists.txt
############ CMakeLists.txt in root/_ext/src dir ############ project(_ext CXX CUDA) set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda) find_package(CUDA 11.4 REQUIRED) file(GLOB CUDA_FILES "*.cu") file(GLOB CXX_FILES "*.cpp") # cmake will not compile cu files without this statement add_library(_ext ${CUDA_FILES} ${CXX_FILES}) target_compile_features(_ext PUBLIC cxx_std_11) set_target_properties(_ext PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
代码文件
main.cpp
### main.cpp ### #include<stdio.h> #include "group_points.h" int main(){ printf("1\n"); return 0; }
group_points.h
### group_points.h ### #pragma once #include <torch/extension.h> at::Tensor group_points(at::Tensor points, at::Tensor idx); at::Tensor group_points_grad(at::Tensor grad_out, at::Tensor idx, const int n);
错误详情
/data_HDD/zhuxingyu/vscode/meshwatermark/model/pointconv/libtorch/include/ATen/ExpandUtils.h:173:169: required from here /usr/include/c++/6/tuple:495:244: error: wrong number of template arguments (4, should be 2) return __and_<__not_<is_same<tuple<_Elements...>,
其余错误均为类似xxx: error: wrong number of template arguments (y, should be z)格式。
问题分析
系统同时存在g++ 6.5和g++ 7.5,但编译时始终调用/usr/include/c++/6/tuple头文件,推测是g++版本与PyTorch的兼容性问题,需在不降级PyTorch和CUDA的前提下解决。
解决方案
1. 强制指定g++7的标准库路径
在根目录CMakeLists.txt开头添加以下配置,确保编译器优先使用g++7对应的标准库(路径需根据实际安装情况调整):
# 配置g++7标准库路径 set(GCC7_INCLUDE "/usr/include/c++/7") set(GCC7_SYSTEM_INCLUDE "/usr/include/c++/7/x86_64-linux-gnu") # 使用BEFORE确保优先加载该路径下的头文件 include_directories(BEFORE ${GCC7_INCLUDE}) include_directories(BEFORE ${GCC7_SYSTEM_INCLUDE})
2. 修正_ext模块的CMake配置
在**_ext/src/CMakeLists.txt**中同步指定编译器和标准库路径,避免子模块使用旧版本gcc:
# 明确指定编译器 set(CMAKE_C_COMPILER "/usr/bin/gcc-7") set(CMAKE_CXX_COMPILER "/usr/bin/g++-7") # 添加g++7标准库路径 set(GCC7_INCLUDE "/usr/include/c++/7") set(GCC7_SYSTEM_INCLUDE "/usr/include/c++/7/x86_64-linux-gnu") include_directories(BEFORE ${GCC7_INCLUDE}) include_directories(BEFORE ${GCC7_SYSTEM_INCLUDE}) # 替换旧版CUDA查找方式为CMake官方推荐的CUDAToolkit find_package(CUDAToolkit 11.3 REQUIRED) target_link_libraries(_ext PRIVATE CUDA::cudart)
3. 清理CMake缓存并重新编译
编译前删除build目录,避免缓存的旧配置干扰:
rm -rf build && mkdir build && cd build && cmake .. && make
4. 升级C++标准版本
libtorch 1.12.0对C++14支持更好,将根目录和_ext模块中的CMAKE_CXX_STANDARD从11改为14:
# 根目录CMakeLists.txt中修改 set(CMAKE_CXX_STANDARD 14) target_compile_features(PointConv PUBLIC cxx_std_14) # _ext/src/CMakeLists.txt中修改 target_compile_features(_ext PUBLIC cxx_std_14)
5. 验证配置正确性
在build目录下执行以下命令,确认编译器和标准库路径是否正确:
# 检查编译器版本 cmake -LA | grep CMAKE_CXX_COMPILER # 检查标准库路径 cmake -LA | grep CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
确保输出中显示的是g++7的路径,且标准库包含/usr/include/c++/7。
内容的提问来源于stack exchange,提问作者K. Zhu
相关产品推荐
相关产品推荐

