前言

  过去构建 Maya C++ 插件是按照 Autodesk 官方提供的流程,在 VS 里面配置项目工程。 参考链接
  通过配置 devkit 的 pluginwizard 来构建项目。
  但是使用 VS 配置 Maya 依赖的头文件和 lib 其实挺不方便的。

image

image

  依赖和修改都在不同选项里面,配置起来要搞半天。
  而且这个工程配置只能兼容 Windows ,如果我们要在 Linux 环境下编译,整个流程又完全不一样了。
  其实解决这种问题,有专门的工具去做。
  这就是 CMake
  通过 cmake 配置可以生成不同平台的工程文件,不需要打开 IDE 就可以调用 compiler 编译结果。

https://github.com/volodinroman/CMakeMaya

  这个仓库是别人配置好的基于 CMake 构建 Maya 插件的仓库。

Doit 自动构建环境

  但是构建编译环境还是挺麻烦的,一方面需要下载 VS 和 CMake
  另外还要配置好 Maya 提供的 SDK

https://github.com/FXTD-ODYSSEY/CMakeMaya

  我这个仓库提供了懒人包环境,只需要配置有 Python 环境和poetry 库。
  在仓库的目录,执行 poetry installpoetry shell 就可以进入开发虚拟环境。(注: 需要管理员权限)
  poetry 会自动安装配置好的依赖,包括 doit 框架
  执行 doit init 会调用 choco 安装 VS 的依赖,以及 CMake
  这个过程需要等待一段时间。

  执行完之后 VS Build Tool 就添加到系统了。
  但还是找不到 C++ compiler ,需要手动打开 installer 下载 C++ CMake 开发包。

image

  使用 doit SDK -v 2020 会下载 Maya 官方的 devkit 到仓库的 SDK 目录。
  准备好环境之后,还需要安装好 maya 2020
  如此就是完备的编译环境,只需要用 doit c 执行 cmake 编译命令来编译 C++ 插件。

1
doit c -p weightDriver -v 2020

  使用 -p 可以指定编译的项目,-v 可以指定编译的 Maya 版本,默认不指定会编译全部项目的 2020 版本
  -p 支持完整的projects 相对路径或者最终目录指定

1
2
doit c -p IngoClemens/weightDriver
doit c -p weightDriver

  执行 doit 的时候会用 python 识别将末端目录变成完整的相对目录

image


  下面是完整执行编译的流程

image

  doit 背后执行的是 拼接输入 执行 cmake 命令

1
cmake -Wno-dev -G "Visual Studio 16 2019" -DMAYA_VERSION={version} -DMAYA_PROJECT={project}. -B build

  DMAYA_VERSION 指定 Maya 版本号
  DMAYA_PROJECT 指定 Maya 项目,多个项目可以用 ; 分割。
  这个命令会读取根目录的 CMakeLists.txt 根据 VS2019 的配置生成 sln 文件到 Build 目录。
  windows 下如果需要 Debug 也可以用 VS 打开 sln 去配置 Debug 工具。

1
cmake --build build --config Release

  后面会执行 build 命令根据配置编译输出到指定目录。

中文乱码坑

💡Vscode terminal 中文乱码

  Window Terminal 默认不支持 MSBuild 的字符输出。

image

  需要在 terminal 上执行 chcp 65001 切换字符集。

添加新工程

  如果需要添加自己的 mll 需要自己填充 CMakeLists.txt 配置
  使用 doit new 可以快速生成 插件 编译模板

cmake 配置说明

projects 下每个项目目录都有对应的 CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/maya${MAYA_VERSION})

# 设置项目名称 (一般编译的文件名取项目名)
project({{cookiecutter.project_name}})

# 添加编译的文件
file(GLOB SRCS "*.cpp" "*.h")

# 添加头文件依赖
include_directories(${MAYA_INCLUDE_DIR})
# 添加 lib 库目录
link_directories(${MAYA_LIBRARY_DIR})
# 链接源码
add_library(${PROJECT_NAME} SHARED ${SRCS})
# 链接 lib
target_link_libraries(${PROJECT_NAME} ${MAYA_LIBRARIES})

# mll 输出配置
MAYA_PLUGIN(${PROJECT_NAME})

  大部分的结构如上图,默认模板如上。
  我加上了注释说明。

  MAYA_PLUGIN方法将 mll 的 initializePlugin uninitializePlugin 两个方法暴露出来(Maya 加载用),并且将 dll 的后缀改为 mll。

用 CMake 编译 Devkit 的案例代码

  上面提到的 CMake 是基于 https://github.com/volodinroman/CMakeMaya 的方案搭建的。
  cmake 文件基本上是自己编写,可以控制每一处的细节。

  其实 Maya 的 Devkit 也提供了一套 CMake 的方案。
  每个插件都保留了 CMakeLists.txt 用于编译。
  如何顺利编译 Maya C++ 的案例插件是一个好问题。
  我过去看 Maya 的文档但是因为不会折腾这个编译(编译出错不知道怎么解决) ,导致无法深入学习 C++ 插件。
  只能拿 Devkit 提供的 Python 文件进行学习。
  通过上面的折腾与学习,自己也算是对 CMake 有了基础的入门,终于有能力搞定这个问题了~

https://help.autodesk.com/view/MAYAUL/2020/ENU/?guid=__developer_Maya_SDK_MERGED_A_First_Plugin_HelloWorld_html

  上面的链接是官方文档提供的一个 Maya 插件最简案例。
  相应的代码在 devkit\plug-ins\helloCmd 找到

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cmake_minimum_required(VERSION 2.8)

# include the project setting file
include($ENV{DEVKIT_LOCATION}/cmake/pluginEntry.cmake)

# specify project name
set(PROJECT_NAME helloCmd)

# set SOURCE_FILES
set(SOURCE_FILES
helloCmd.cpp

)

# set linking libraries
set(LIBRARIES
OpenMaya
Foundation
)

# Build plugin
build_plugin()

  构建插件的 cmake 代码如上,核心部分是 $ENV{DEVKIT_LOCATION} 通过环境变量获取 Devkit 的路径
  所以执行 CMake 之前可以配置一下环境变量。

1
2
3
set DEVKIT_LOCATION=F:\maya_devkit\devkitBase
cmake -G "Visual Studio 16 2019" . -B build
cmake --build build --config Release

image

  如此操作,就可以编译出 mll 了。(前提是要配置好 VS 的环境)

总结

  这个环境我通过 虚拟机 测试过,在 win10 环境是没有问题。
  通过 cmake 配置可以快速构建好 C++ 编译环境,比起以前折腾 VS 来方便太多了。
  利用 choco 来安装依赖也解决了各种缺库导致起不来的问题。
  通过这个人懒人包可以极大降低 Maya 写 C++ 的难度。

2022-7-8 补充说明

  最近利用 submodule 添加了很多社区的 C++ 库。
  clone 仓库之后需要用执行 git submodule update --init 来拉取 submodule

  一些注意事项请参阅 readme 文档