我在我的项目中遇到了一个问题,函数名称 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 头文件而不能触及源文件。我认为命名问题可能是我得到的编译错误“expected unqualified-id before numeric constant”引起的。
我尝试调用“objcopy --redefine-sym PropertyNotify=FbxPropertyNotify libfbxsdk.a”以重新定义静态库中的函数名称。通过这样做,解决了“expected unqualified-id”错误,但是,它似乎以某种方式弄乱了静态库,因为它在调用 FBX 函数或对象的代码中导致了数百个 undefined reference 错误。
我想知道这个问题的解决方案是什么?正如某人所建议的那样,创建 FBX 库的包装器可能可以解决问题。如果可能的话,如果有人可以分享一些关于如何在 Ubuntu 上实现它的详细教程或指导,那将是非常好的。提前致谢。
最佳答案
也许您可以创建一个包装器共享库来链接 libfbx.so
。参见 this answer (描述如何构建链接到 lib123.so
的 libabc.so
)。
但您确实应该向该 FBX 库的供应商寻求指导。可能是他们的其他一些客户遇到了类似的问题,并且他们已经找到了一些解决方法。
(直觉上,我不建议在专有的 libfbx.so
上玩 objcopy
把戏)
您还可以自定义您的编译器(例如,如果使用 MELT 则使用 GCC ...)让它专门处理一些特定的名称,例如 PropertyNotify
(但我不确定它是一个好主意,当然需要数周的努力)。
关于c++ - 在静态库中重新定义函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41305401/