Verknüpfung einer Maya -Client -Bibliothek mit libopenmayalib.a fehlschlägt, Mlibrary :: Initialize kann nicht gefunden werden (obwohl NM libopenmayalib.a enthält)

StackOverflow https://stackoverflow.com/questions/4593195

Frage

Ich versuche meine App mit der Maya C ++ - API zu verknüpfen, aber ich bekomme:

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

Aber NM zeigt:

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

Das scheint Mlibrary zu entsprechen :: Initialize, das sieht aus wie:

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

};

Der Verknüpfungsprozess wird mit:

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

Das System ist Ubuntu Maverick 10.10, 64-Bit und Maya ist ebenfalls 64-Bit, und das Zusammenstellen mit -M64 liefert das gleiche Ergebnis.

Ich fand einen ähnlichen Beitrag http://area.autodesk.com/forum/autodesk-maya/sdk/link-errors-when-using-the-openmaya-api-on-nux/ Ich habe einige Ideen aus seiner Datei genommen, wie die Verwendung des -wl, -rpaths, aber das ändert nichts.

Ich habe auch versucht, G ++-4.1 zu installieren, da es anscheinend der in den Skripten erwähnt zu sein scheint, aber das hat auch nichts geändert (die aktuelle Version ist G ++-4.4)

Vielen Dank in Bezug auf // Johan

War es hilfreich?

Lösung

Das Problem ist die Art, wie Sie anrufen MLibrary::initialize.

Es erwartet eine nicht konstante Zeichenfolge, die wahrscheinlich mit einer wörtlichen Zeichenfolge gefüttert wird, die implizit konstant ist.

Was Sie anrufen, ist so etwas wie lib.initialize(false, "my app", false) was gleich ist MLibrary::initialize(bool, const char*, bool) - Diese Signatur wird in der Tat nicht durch Mlibrary exportiert.

Was Sie tun müssen, damit es funktioniert, ist die Verwendung eines nicht konstanten Anwendungsnamens, zum Beispiel:

// 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);

Notiz: Dies ist ein Schnittstellenfehler, da der Anwendungsname tatsächlich als als gefüttert werden sollte const char* - Dieser Fehler ist in späteren Maya -Versionen behoben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top