在静态库中重新定义函数名称

时间:2016-12-23 17:14:09

标签: c++ linux xlib fbx

我在我的项目中遇到了一个问题,作为函数名,PropertyNotify()在几个类中,在FBX静态库中已经被定义为Linux上X11 / X.h中的宏int值。

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

FBX不是开源的,只提供包头和静态和动态库(.a和.os),因此我只能在我的应用程序中包含FBX标题但不能触及源文件。我认为命名问题可能是编译错误引起的"期望在数字常量之前的非限定id"我有。

我试过调用" objcopy --redefine-sym PropertyNotify = FbxPropertyNotify libfbxsdk.a"以便在静态库中重新定义函数名称。通过这样做,"预期的不合格身份"错误已经解决了,但是,似乎某种程度上搞乱了静态库,因为它在FBX函数或被调用对象的代码中导致了数百个未定义的引用错误。

我想知道这个问题的解决方案是什么?正如某人所建议的,创建FBX库的包装器可能可以解决问题。如果可能的话,如果有人可以分享一些关于如何在Ubuntu上实现它的详细教程或指导,那将是非常友好的。提前致谢。

1 个答案:

答案 0 :(得分:1)

也许您可以创建一个包装{@ 1}}的包装器共享库。请参阅this answer(说明如何构建与libfbx.so相关联的libabc.so

但是你真的应该向FBX库的供应商寻求指导。可能是他们的其他一些客户遇到了类似的问题,他们已经找到了一些解决方法。

(直觉上,我不建议在专有lib123.so上播放objcopy技巧

您也可以自定义您的编译器(例如,如果使用MELT,则使用GCC ...)以使其具体处理某些特定名称,例如libfbx.so(但我不确定它)是一个好主意,它肯定需要数周的努力。)