我需要为一个静态包含某个C++库的应用程序编写一个插件,该库 * 不 * 使用名称空间。
不幸的是,我的插件需要链接到同一个库的自定义版本。
理想情况下,我想重新编译它,使它的符号不与那些在应用程序中发现冲突。
这样做的一种方法是,在不需要编辑数百个文件的情况下,也不会失去从上游应用新更新的能力,在编译时 * 向库 * 添加一个名称空间前缀 *。
显然,没有g++
选项可以做到这一点。或者,有没有什么方法可以通过编程方式改变已经编译好的.so
文件中的符号?
- 在另一个问题(Renaming symbols at compile time without changing the code in a cross platform way)中建议使用预处理器指令来改变编译是不实际的,因为符号的数量是巨大的
- 试图让命名空间作为补丁获得上游批准是最好的长期解决方案,但这可能需要一段时间,同时我需要一个临时解决方案
EDIT:澄清一下,问题不在库-插件边界,那是“容易”的部分;问题是我有一个巨大的库,我想找到一种方法来重新编译它,就好像它都属于某个名称空间 * 而 * 不必更改源代码。
4条答案
按热度按时间x4shl7ld1#
我没看到简单的解决办法。您可以编写一个GCC plugin或GCC MELT中的扩展来完成这项工作,但这可能工作量太大。
如果库是免费的,并且允许您更改它,我会制作补丁,并将它们推到上游(即使这确实需要一些时间)。
vltsax252#
为什么不写一个打开一个名称空间的文件,然后包含您已经拥有的文件?
tvokkenx3#
我们为其中一个链接的库做了这件事
然后从新的命名空间调用它的函数
编辑:我可能错过了一点,因为我不确定这将如何影响符号
arknldoa4#
如果你的意思是你希望通过GCC命令行选项来添加命名空间,那么正如UncleZeiv在他们的回答中指出的那样,确实没有这样的直接命令行选项。
但是,如果您能够在代码库中创建一个新文件,则可以通过将名称空间代码添加到该新文件中,然后使用GCC的-include选项将该文件添加到源代码中来实现此效果