2016-12-23 1 views
0

J'ai rencontré un problème dans mon projet en tant que nom de fonction, PropertyNotify() dans les couples de classes, dans la bibliothèque statique FBX a déjà été définie comme valeur de macro int dans X11/Xh sous Linux .Redéfinir le nom de la fonction dans une bibliothèque statique

virtual bool PropertyNotify(eFbxPropertyCallback, KFbxProperty*); //kfbxobject.h 

virtual bool PropertyNotify(eFbxPropertyCallback pType, KFbxProperty* pProperty); //kfbxnode.h 

virtual bool PropertyNotify(EPropertyNotifyType pType, FbxProperty& pProperty); //fbxmanipulators.h 

virtual bool PropertyNotify(eFbxPropertyCallback pType, KFbxProperty* pProperty); //kfbxtexture.h 

#define PropertyNotify  28 //X.h 

Le FBX est pas open source et ne fournit les comprennent en-têtes et bibliothèque statique et dynamique (.a et .os), donc je ne peux inclure les en-têtes FBX dans mon application, mais ne peut pas toucher les fichiers source. Je pense que le problème de nommage peut être causé par l'erreur de compilation "attendu non qualifié-id avant la constante numérique" que j'ai.

J'ai essayé d'appeler "objcopy --redefine-sym PropertyNotify = FbxPropertyNotify libfbxsdk.a" afin de redéfinir le nom de la fonction dans la bibliothèque statique. En faisant cela, l'erreur "expected unqualified-id" a été résolue, cependant, il semblait en quelque sorte foiré la bibliothèque statique parce qu'elle provoquait des centaines d'erreurs de références indéfinies dans les codes où les fonctions FBX ou les objets étaient appelés. Je me demande quelle est la solution à ce problème? Comme suggéré par quelqu'un, créer un emballage de la bibliothèque FBX pourrait probablement résoudre le problème. Si cela est possible, il serait très aimable que quelqu'un puisse partager un tutoriel détaillé ou des conseils sur la façon de l'implémenter sur Ubuntu. Merci d'avance.

+2

Puisque vous utilisez une bibliothèque propriétaire, vous avez probablement acheté un support pour cela. Utilisez donc la ligne de support. Ou renommez votre * 'PropertyNotify' en quelque chose d'autre, comme' MichaelPropertyNotify' (et c'est probablement la solution la plus simple). –

+0

Je ne peux pas accéder aux fichiers source donc je ne pense pas que je puisse renommer la fonction ou recompiler la bibliothèque statique après les changements. En outre, j'ai essayé de redéfinir le nom de la fonction à d'autres en utilisant "objcopy --redefine-sym" sur le terminal. Ce n'était pas une bonne idée car cela a gâché la bibliothèque statique et causé d'autres erreurs de liaison. –

+0

J'ai pensé à * votre * code, pas à celui de FBX. Et il se peut que votre problème n'ait pas de solution facile, c'est pourquoi je recommande de travailler avec le support fourni par le fournisseur de FBX. –

Répondre

1

Vous pourriez peut-être créer une bibliothèque partagée wrapper qui lierait libfbx.so. Voir this answer (décrivant comment créer un libabc.so lié à lib123.so).

Mais vous devriez vraiment demander conseil au vendeur de cette bibliothèque FBX. Il se pourrait que certains de leurs clients aient rencontré un problème similaire, et ils ont déjà découvert une solution de contournement.

(intuitivement, je ne recommande pas de jouer objcopy astuces sur le libfbx.so propriétaire)

Vous pouvez également personnaliser votre compilateur (par exemple à l'aide MELT si vous travaillez avec GCC ...) pour l'avoir traiter spécifiquement certains des noms particuliers comme PropertyNotify (mais je ne suis pas sûr que ce soit une bonne idée, et cela prend certainement des semaines d'efforts).