La vinculación de una biblioteca de cliente Maya para libOpenMayalib.a falla, MLibrary :: initialize no se puede encontrar (a pesar de que muestra nm libOpenMayalib.a lo contiene)
Pregunta
Estoy intentando conectar mi aplicación con la API de los mayas C ++, pero me sale:
Debug/../src/main.cpp:80: undefined reference to `MLibrary::initialize(bool, char*, bool)'
pero, espectáculos nm:
nm libOpenMayalib.a | grep initialize
00000000000004b0 T _ZN8MLibrary10initializeEPcb
0000000000000380 T _ZN8MLibrary10initializeEbPcb
0000000000000000 b _ZZN8MLibrary10initializeEbPcbE13isInitialized
que parece coincidir con MLibrary :: initialize, que se parece a:
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
};
El proceso de vinculación se ejecuta con:
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
El sistema es Ubuntu Maverick 10,10, 64 bits, y Maya es de 64 bits, así, y compilar con -m64 da el mismo resultado.
I encontró un puesto similar http://area.autodesk.com/forum/autodesk-maya/sdk/link-errors-when-using-the-openmaya-api-on-linux/ i tomó algunas ideas de su archivo, como el uso de la -Wl, -rpath, pero, que no cambia nada ..
También intentado instalar g ++ - 4.1, ya que parece ser el que se menciona en los guiones, pero eso no cambia nada tampoco (versión actual es g ++ - 4.4)
Gracias en lo que respecta // Johan
Solución
El problema es la forma en que se llama a MLibrary::initialize
.
Se espera una cadena Char no constante, lo que probablemente se alimenta con una cadena de carbón literal que es implícitamente constante.
Lo que llamas es algo así como lo que equivale a lib.initialize(false, "my app", false)
MLibrary::initialize(bool, const char*, bool)
-. Esta firma de hecho no se exporta por MLibrary
Lo que hay que hacer para que el trabajo es el uso de un nombre de aplicación no constante, por ejemplo:
// 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);
Nota:. Este es un error de interfaz como el nombre de la aplicación de hecho debe ser alimentado como un const char*
- Este error se corrigió en versiones posteriores maya