You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:35:27