c++ - Maya插件cmake和VS2012编译问题

标签 c++ visual-studio-2012 cmake maya

我正在尝试编译在 Maya API 中找到的示例插件使用 cmake 创建 Visual Studio 2012 项目。然而,编译 Maya 附带的库时似乎存在许多问题。第一个问题是库试图补偿一些旧的缺失的 bool 实现,这是通过添加预处理器定义解决的

add_definitions(-D _BOOL)

到 cmake 文件。

他们的库的下一个错误是它尝试访问 std::ostream 但无法在“std”中找到它的问题,这是使用 cmake 中的另一个定义解决的:

add_definitions(-D REQUIRE_IOSTREAM)

这导致了我无法解决的最终错误,我用谷歌搜索了它,查看了 stackoverflow,并查看了 Maya 附带的示例 VSproject 文件,无法解决它。 错误(总共 18 个)源于链接器,并且都是未解析的外部符号,示例错误:

Error   1   error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall MStatus::MStatus(enum MStatus::MStatusCode)" (__imp_??0MStatus@@QAE@W4MStatusCode@0@@Z) referenced in function "public: virtual class MStatus __thiscall hello::doIt(class MArgList const &)" (?doIt@hello@@UAE?AVMStatus@@ABVMArgList@@@Z) C:\path\mayacmake_sample\helloworld.obj Sample_helloworld

编辑: 使用 Andreas 修改后的 cmakelist 没有产生任何差异: 嘿,感谢您的回复,但我仍然遇到很多 Unresolved external 错误:

Error   1   error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall MStatus::MStatus(enum MStatus::MStatusCode)" (__imp_??0MStatus@@QAE@W4MStatusCode@0@@Z) referenced in function "public: virtual class MStatus __thiscall hello::doIt(class MArgList const &)" (?doIt@hello@@UAE?AVMStatus@@ABVMArgList@@@Z) D:\mayacmake_sample\helloworld.obj  Maya_Sample_Plugin
Error   13  error LNK2001: unresolved external symbol "public: virtual bool __thiscall MPxCommand::hasSyntax(void)const " (?hasSyntax@MPxCommand@@UBE_NXZ)  D:\mayacmake_sample\helloworld.obj  Maya_Sample_Plugin

我删除了其他错误,因为它们看起来与上面的两个相同。 我确保修改 cmake 文件中的路径以适合我的安装,现在如下所示:

cmake_minimum_required (VERSION 2.6)

SET(MAYA_PLUGIN_NAME "Maya_Sample_Plugin")
SET(MAYA_DIRECTORY "C:/Program Files/Autodesk/Maya2013")
SET(MAYA_HEADERS_DIR "${MAYA_DIRECTORY}/include")
SET(MAYA_LIBRARY_DIR "${MAYA_DIRECTORY}/lib")

SET(SOURCE_FILES
  helloworld.cpp 
)

source_group("" FILES ${SOURCE_FILES})

INCLUDE_DIRECTORIES(
  ${MAYA_HEADERS_DIR}
  ${Boost_INCLUDE_DIR}
)
LINK_DIRECTORIES(
  ${MAYA_LIBRARY_DIR}
)

SET(LIBRARIES
  Foundation.lib
  OpenMaya.lib
  OpenMayaAnim.lib
  OpenMayaUI.lib
)

SET(MAYA_DEFINITIONS _AFXDLL _MBCS NT_PLUGIN REQUIRE_IOSTREAM _BOOL)

ADD_LIBRARY(${MAYA_PLUGIN_NAME} SHARED ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(${MAYA_PLUGIN_NAME} ${LIBRARIES})

SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES COMPILE_DEFINITIONS "${MAYA_DEFINITIONS}")
SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES OUTPUT_NAME "${MAYA_PLUGIN_NAME}")
SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES SUFFIX ".mll")
SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES CLEAN_DIRECT_OUTPUT 1)

感谢任何有关此事的帮助。

最佳答案

您需要告诉链接器要链接哪些库,通过 TARGET_LINK_LIBRARIES 完成。这是我在 CMakeLists.txt 中使用的内容。

SET(MAYA_PLUGIN_NAME "myCoolPlugin")
SET(MAYA_DIRECTORY "D:/Program Files (x86)/Autodesk Maya2011")
SET(MAYA_HEADERS_DIR "${MAYA_DIRECTORY}/include")
SET(MAYA_LIBRARY_DIR "${MAYA_DIRECTORY}/lib")

SET(SOURCE_FILES
  myCoolPlugin.cpp 
)

source_group("" FILES ${SOURCE_FILES})

INCLUDE_DIRECTORIES(${MAYA_HEADERS_DIR})
LINK_DIRECTORIES(${MAYA_LIBRARY_DIR})

SET(LIBRARIES Foundation.lib OpenMaya.lib OpenMayaAnim.lib OpenMayaUI.lib)

SET(MAYA_DEFINITIONS _AFXDLL _MBCS NT_PLUGIN REQUIRE_IOSTREAM _BOOL)

ADD_LIBRARY(${MAYA_PLUGIN_NAME} SHARED ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(${MAYA_PLUGIN_NAME} ${LIBRARIES})

SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES COMPILE_DEFINITIONS "${MAYA_DEFINITIONS}")
SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES OUTPUT_NAME "${MAYA_PLUGIN_NAME}")
SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES SUFFIX ".mll")
SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES CLEAN_DIRECT_OUTPUT 1)

SET_TARGET_PROPERTIES(${MAYA_PLUGIN_NAME} PROPERTIES LINK_FLAGS "/export:initializePlugin /export:uninitializePlugin")

关于c++ - Maya插件cmake和VS2012编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17747339/

相关文章:

c++ - 无法在 C++ 中的 for 循环条件语句中使用 vector.size()

unit-testing - 如何在 Visual Studio 2012 和 Entity Framework 5 中设置 LocalDb 进行单元测试

c++ - googletest架构x86_64错误的 undefined symbol

c++ - 为什么 cmake 在 64 位系统上查找 32 位库而不是 64 位库?

cmake - 在 CMake 中列出 include_directories

c++ - 在共享内存中复制 char* boost

c++ - header 中的 private static const 成员变量与 cpp 中的 const 变量

java - JNI 本地引用空闲时间

c# - 没有麦克风? SpeechRecognitionEngine SetInputToDefaultAudioDevice() 问题

javascript - AngularJS 和 Windows 8 路由错误