Lier une bibliothèque cliente Maya libOpenMayalib.a ne réussit pas, MLibrary :: initialize ne peut pas être trouvé (même si nm montre libOpenMayalib.a contient)
Question
Je suis en train de lier mon application avec Maya API C de, mais je reçois:
Debug/../src/main.cpp:80: undefined reference to `MLibrary::initialize(bool, char*, bool)'
mais, nm montre:
nm libOpenMayalib.a | grep initialize
00000000000004b0 T _ZN8MLibrary10initializeEPcb
0000000000000380 T _ZN8MLibrary10initializeEbPcb
0000000000000000 b _ZZN8MLibrary10initializeEbPcbE13isInitialized
qui semble correspondre MLibrary :: initialize, qui ressemble à:
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
};
Le processus de liaison est exécuté avec:
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
Le système est Ubuntu Maverick 10,10, 64 bits, et Maya est de 64 bits ainsi, et la compilation avec -m64 donne le même résultat.
J'ai trouvé un poste similaire http://area.autodesk.com/forum/autodesk-maya/sdk/link-errors-when-using-the-openmaya-api-on-linux/ j'ai pris quelques idées de son dossier, comme l'utilisation de la -Wl, -rpath, mais qui ne change rien ..
J'ai aussi essayé d'installer g ++ - 4.1 car il semble être celui mentionné dans les scripts, mais cela n'a pas rien de changement soit (version actuelle est g ++ - 4.4)
Merci en ce qui concerne // Johan
La solution
Le problème est la façon dont vous appelez MLibrary::initialize
.
Il attend une chaîne char non-const, qui est probablement alimenté par une chaîne char littérale qui est implicitement constante.
Ce que vous appelez est quelque chose comme ce qui équivaut à lib.initialize(false, "my app", false)
MLibrary::initialize(bool, const char*, bool)
-. Cette signature est en effet pas exporté par MLibrary
Qu'est-ce que vous avez à faire pour rendre le travail est d'utiliser un nom d'application non-const, par exemple:
// 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);
Remarque:. Ceci est un bug d'interface que le nom de l'application doit en effet être alimenté comme const char*
- ce bug est corrigé dans les versions ultérieures MAYA