我正在尝试将我的应用程序与Maya C ++ API链接,但是得到:

Debug/../src/main.cpp:80: undefined reference to `MLibrary::initialize(bool, char*, bool)'


但是,nm显示:

nm libOpenMayalib.a | grep initialize
00000000000004b0 T _ZN8MLibrary10initializeEPcb
0000000000000380 T _ZN8MLibrary10initializeEbPcb
0000000000000000 b _ZZN8MLibrary10initializeEbPcbE13isInitialized


看起来与MLibrary :: initialize匹配,如下所示:

class OPENMAYA_EXPORT MLibrary
{
public:
      MLibrary ();
 virtual    ~MLibrary ();
 static MStatus  initialize (char* applicationName,
         bool viewLicense = false);
 static MStatus  initialize (bool wantScriptOutput,
         char* applicationName,
         bool viewLicense = false);
 static void   cleanup( int exitStatus = 0 );

protected:
// No protected members

private:
// No private members

};


链接过程通过以下方式运行:

g++ -L/usr/autodesk/maya2009-x64/lib -m64 -pthread -Wl,-rpath,/usr/autodesk/maya2009-x64/lib -lOpenMayalib  -l3dGraphics -lAG -lAnimEngine -lAnimSlice -lAnimUISlice -lAppVersion -lAshliFX -lAshli -lAutoCam -lawCacheShared -lawnSolver -lawxml2 -lBase -lCgGL -lCg -lCloth -lCommandEngine -lcxaguard -lDataModel -lDebug -lDeformSlice -lDeformUISlice -lDependCommand -lDependEngine -lDevices -lDynSlice -lDynUISlice -lExplorerSlice -lExtensionLayer -lfbxfilesdk -lFoundation -lgcc_s -lGeometryEngine -lguide -lhairlib -lHalf -lHumanIKShared -lHWFoundation -lHWGL -lHWRenderMaya -lHWRender -lIex -liff -lIlmImf -lImage -lImageUI -lImath -lIMFbase -limf -lirc -lJasperSlice -lKinSlice -lKinUISlice -lManips -lMaya -lmocap -lModelSlice -lModelUISlice -lModifiers -lMotionCapture -lNurbsEngine -lNurbsSlice -lNurbs -lNurbsUISlice -lOpenMayaAnim -lOpenMayaFX -lOpenMayaRender -lOpenMaya -lOpenMayaUI -lPolyEngine -lPolySlice -lPoly -lPolyUISlice -lProjectSlice -lPsdTexture -lpython2.5 -lRenderModel -lRenderSlice -lRenderUISlice -lShared -lSharedUI -lstdc++ -lstdc++ -lSubdivEngine -lSubdivGeom -lSubdiv -lSubdivUI -lsvml -ltbbmalloc -ltbb -lTranslators -lUIComponents -lUrchinSlice -lUrchinUISlice -lXm -lzlib -o"BinaryGL3MdlMayaExporter"  ./src/Exporter.o ./src/Format.o ./src/Generic.o ./src/Output.o ./src/main.o   -lm -lgtk-x11-2.0 -ldl -lpthread -lgdk-x11-2.0


系统是64位的Ubuntu Maverick 10.10,而Maya也是64位,使用-m64进行编译可获得相同的结果。

我发现了一个类似的帖子http://area.autodesk.com/forum/autodesk-maya/sdk/link-errors-when-using-the-openmaya-api-on-linux/,我从他的文件中吸取了一些想法,例如使用-Wl,-rpath,但是并没有任何改变。

我也尝试安装g ++-4.1,因为它似乎是脚本中提到的那个,但是也没有任何改变(当前版本是g ++-4.4)。

谢谢
//约翰

最佳答案

问题是您调用MLibrary::initialize的方式。

它需要一个非常量char字符串,该字符串很可能是隐式常量的文字char字符串。

您所说的类似于lib.initialize(false, "my app", false)等于MLibrary::initialize(bool, const char*, bool)-此签名确实不是MLibrary导出的。

要使其正常工作,您需要做的是使用非常量应用程序名称,例如:

// char* appName = "my app"; would be deprecated as string literals are always const
char appName[] = {'m','y',' ','a','p','p'};
lib.initialize(false, appName, false);


注意:这是一个界面错误,因为应用程序名称确实应以const char*的形式输入-此错误在更高的maya版本中已得到修复。

关于linux - 将Maya客户端库链接到libOpenMayalib.a失败,找不到MLibrary::initialize(即使nm显示libOpenMayalib.a包含它),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4593195/

10-11 16:29