我需要为一个静态包含某个不使用命名空间的C ++库的应用程序编写一个插件。
不幸的是,我的插件需要链接到同一个库的自定义版本。
理想情况下,我想重新编译它,使其符号不会与应用程序中的符号冲突。
这样做的一种方法是,在不必编辑数百个文件且不失去从上游应用新更新的能力的情况下,将在编译时向库添加名称空间前缀时间
显然虽然没有g++
选项可以做到这一点。或者,有没有办法以编程方式更改已编译的.so
文件中的符号?
根据另一个问题(Renaming symbols at compile time without changing the code in a cross platform way)中的建议使用预处理程序指令更改编译是不切实际的,因为符号数量很大
尝试将上游命名空间作为补丁获得批准是最好的长期解决方案,但这可能需要一段时间,同时我需要一个临时解决方案
编辑:澄清一下,问题不在于库插件边界,这是“简单”部分;问题是我有这个庞大的库,我想找到一种方法来重新编译它,好像它都属于某个命名空间,而不必更改源代码。
答案 0 :(得分:1)
我没有看到一个简单的解决方案。你可以编写GCC plugin或GCC MELT中的扩展来完成这项工作,但这可能太多了。
如果库是免费的,并且如果你允许更改它,我会制作补丁,并将它们推向上游(即使这需要一些时间)。
答案 1 :(得分:1)
为什么不写一个打开命名空间然后包含你已经拥有的文件的文件?
答案 2 :(得分:0)
我们为其中一个与
链接的库执行此操作namespace MY_NAMESPACE
{
#include "api\api.h"
}
然后只需从新命名空间
调用其函数MY_NAMESPACE::api_function();
编辑:我可能已经错过了一点,因为我不确定这将如何影响符号