VS Code更新后CMake构建GLM遇路径变更与编译警告问题
问题分析与解决方案
一、警告含义解析
- 警告#20012-D:当函数在首次声明时被显式默认(如
= default),同时标记__host__和__device__注解,编译器会忽略其中一个注解。这是CUDA编译器的规则,默认函数不支持同时指定主机端和设备端属性。 - 警告#20013-D:在
__host__ __device__函数中调用仅标记__host__的constexpr函数,CUDA默认不允许这种跨端调用,需要启用实验性选项--expt-relaxed-constexpr才能放宽限制。
二、为何之前未出现警告
你之前的配置依赖GLM的安装版头文件,但原CMake脚本中ExternalProject_Add的BUILD_COMMAND和INSTALL_COMMAND为空,意味着从未真正执行GLM的构建与安装流程——之前能正常工作是因为构建目录残留了旧的安装文件。清理构建目录后,你被迫直接引用GLM的源码目录,而GLM源码默认会启用CUDA相关的编译宏(如GLM_FORCE_CUDA),同时你的项目可能因其他库或工具链配置,意外触发了CUDA编译器的语法检查,导致这些原本隐藏的警告暴露出来。
VS Code版本变更只是巧合,真正的诱因是构建目录清理后GLM引用路径的变化,以及源码版GLM的默认编译配置。
三、安全的解决方法
1. 修复GLM的CMake配置(推荐)
恢复到使用GLM安装版的方式,确保ExternalProject_Add正确执行构建和安装:
set(DEP_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep) set(GLM_INSTALL_DIR ${DEP_DIR}/glm/install) set(libGLM glm) ExternalProject_Add(${libGLM} PREFIX ${DEP_DIR}/${libGLM} GIT_REPOSITORY https://github.com/g-truc/glm.git LOG_DOWNLOAD ON # 移除空的BUILD/INSTALL命令,让CMake自动执行构建安装流程 UPDATE_DISCONNECTED 1 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${GLM_INSTALL_DIR} -DGLM_INSTALL:BOOL=ON -DUSE_MSVC_RUNTIME_LIBRARY_DLL:BOOL=OFF ) target_include_directories(${EXECUTABLE_NAME} PUBLIC ${GLM_INSTALL_DIR}/include )
注意:原脚本中添加的
GLAD_INSTALL等参数属于GLAD库的配置,并非GLM的选项,会被GLM的CMakeLists忽略,建议删除。
2. 禁用GLM的CUDA宏(临时方案)
如果暂时需要直接引用GLM源码目录,在项目中强制禁用CUDA相关定义:
- 方法1:在包含GLM头文件前添加宏定义
#define GLM_FORCE_CUDA OFF #include <glm/glm.hpp>
- 方法2:通过CMake全局添加定义
add_definitions(-DGLM_FORCE_CUDA=OFF)
3. 针对性抑制警告(不推荐,仅作应急)
如果必须保留CUDA相关配置,可针对NVCC编译器添加警告抑制:
target_compile_options(${EXECUTABLE_NAME} PRIVATE $<$<COMPILE_LANGUAGE:CUDA>: -Wno-20012 -Wno-20013 > )
如果是MSVC编译器触发的警告,可使用/wd20012、/wd20013选项,但需注意这些警告码属于NVCC,仅在CUDA编译路径下生效。
4. 检查项目CUDA配置
确认你的项目没有意外启用CUDA编译:检查是否有其他依赖库引入了CUDA,或CMake工具链是否自动检测到CUDA并启用了相关编译规则,导致你的相机类代码被NVCC处理。
内容的提问来源于stack exchange,提问作者b.m.
相关产品推荐
相关产品推荐

