我需要为应用程序编写一个插件,该应用程序静态包含某个不使用 namespace 的 C++ 库。
不幸的是,我的插件需要链接到同一个库的自定义版本。
理想情况下,我想重新编译它,使其符号不会与应用程序中的符号冲突。
一种方法可以做到这一点,而不必编辑数百个文件,也不会失去从上游应用新更新的能力,在编译时向库添加命名空间前缀时间。
显然,虽然没有 g++
选项可以做到这一点。或者,是否有任何方法可以通过编程方式更改已编译的 .so
文件中的符号?
按照另一个问题 (Renaming symbols at compile time without changing the code in a cross platform way) 中的建议使用预处理器指令更改编译是不切实际的,因为符号的数量很大
尝试让上游批准命名空间作为补丁是最好的长期解决方案,但这可能需要一段时间,同时我需要一个临时解决方案
编辑:澄清一下,问题不在库-插件边界,那是“简单”的部分;问题是我有这个庞大的库,我想找到一种方法来重新编译它,就好像它都属于某个命名空间一样而不必更改源代码。
最佳答案
我没有看到一个简单的解决方案。您可以编写 GCC plugin或 GCC MELT 中的扩展名完成这项工作,但这可能是太多的工作。
如果库是免费的,并且允许您更改它,我会制作补丁并将它们推送到上游(即使这确实需要一些时间)。
关于c++ - 有没有办法在编译时添加命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011535/