在Maya C++插件中使用C++算法库遇std::clamp报错的解决方法
解决std::clamp找不到的问题
核心原因
std::clamp是C17标准引入的特性,调用build_plugin()后,Maya DevKit的配置脚本(devkit.cmake)可能覆盖了你设置的C标准,或是编译器宏定义被修改,导致C++17特性未正常启用。
解决方案
1. 强制为目标指定C++17特性
在CMakeLists.txt中调用build_plugin()后,直接为项目目标添加C++17编译特性,确保标准不会被DevKit配置覆盖:
build_plugin() # 强制当前项目目标启用C++17标准特性 target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
2. 修复DevKit的C++标准覆盖
如果上述方法无效,打开$ENV{DEVKIT_LOCATION}/cmake/devkit.cmake文件,查找是否存在修改CMAKE_CXX_STANDARD的代码,比如:
set(CMAKE_CXX_STANDARD 14)
将其修改为17,或直接注释该行,让项目自身的C++标准设置生效。
3. 添加编译器宏确保C++17特性启用
针对不同编译器添加必要宏定义,避免特性被隐藏:
- GCC/Clang:在
CMakeLists.txt中添加add_compile_definitions(_GLIBCXX_USE_CXX17_ABI=1) - MSVC:添加
add_compile_definitions(_ENABLE_EXTENDED_ALIGNED_STORAGE)
4. 验证CLion的CMake配置
在CLion中执行以下操作确保配置生效:
- 点击顶部工具栏
File -> Reload CMake Project - 查看
CMake工具窗口日志,确认CMAKE_CXX_STANDARD已被设置为17
修改后的CMakeLists.txt示例
cmake_minimum_required(VERSION 3.26) project(clamp_test) # 预先设置严格的C++17标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 定义Maya DevKit路径 set(ENV{DEVKIT_LOCATION} "/user_data/Dev/devkitBase") set(DEVKIT_INCLUDE_DIR $ENV{DEVKIT_LOCATION}/include) set(DEVKIT_LIBRARY_DIR $ENV{DEVKIT_LOCATION}/lib) # 引入DevKit配置脚本 include($ENV{DEVKIT_LOCATION}/cmake/pluginEntry.cmake) set(SOURCE_FILES main.cpp) set(LIBRARIES OpenMaya Foundation) build_plugin() # 强制目标启用C++17特性 target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
内容的提问来源于stack exchange,提问作者osterburg
相关产品推荐
相关产品推荐

