C++ 有没有办法在编译时添加名称空间?

C++ 有没有办法在编译时添加名称空间?,c++,compilation,C++,Compilation,我需要编写一个插件,它静态地包含一个不使用名称空间的C++库。 不幸的是,我的插件需要链接到同一库的自定义版本 理想情况下,我希望重新编译它,以便它的符号不会与应用程序中的符号冲突 一种方法是在编译时向库中添加名称空间前缀,这种方法不必编辑数百个文件,也不丧失从上游应用新更新的能力 显然,尽管没有g++选项可以做到这一点。或者,是否有任何方法可以通过编程方式更改已编译的.so文件中的符号 按照另一个问题()中的建议,使用预处理器指令修改编译是不实际的,因为符号的数量是巨大的 尝试将名称空间作为

我需要编写一个插件,它静态地包含一个不使用名称空间的C++库。 不幸的是,我的插件需要链接到同一库的自定义版本

理想情况下,我希望重新编译它,以便它的符号不会与应用程序中的符号冲突

一种方法是在编译时向库中添加名称空间前缀,这种方法不必编辑数百个文件,也不丧失从上游应用新更新的能力

显然,尽管没有
g++
选项可以做到这一点。或者,是否有任何方法可以通过编程方式更改已编译的
.so
文件中的符号

  • 按照另一个问题()中的建议,使用预处理器指令修改编译是不实际的,因为符号的数量是巨大的

  • 尝试将名称空间作为补丁在上游获得批准是最好的长期解决方案,但这可能需要一段时间,同时我需要一个临时解决方案



编辑:澄清一下,问题不在库插件边界,这是“容易”的部分;问题是我有一个巨大的库,我想找到一种方法重新编译它,就好像它都属于某个名称空间一样,而不必更改源代码。

我看不到一个简单的解决方案。您可以编写一个GCC或一个扩展来完成这项工作,但这可能太多了


如果库是免费的,并且允许您更改它,我会制作补丁,并将它们推到上游(即使这需要一些时间)。

为什么不编写一个文件,打开一个名称空间,然后包含您已有的文件?

我们为链接的库之一执行此操作

namespace MY_NAMESPACE
{
 #include "api\api.h"
}
然后从新名称空间调用它的函数

MY_NAMESPACE::api_function();

编辑:我可能有点忽略了这一点,因为我不确定这将如何影响符号

“api/api.h”
包含任何其他标题时,这可能会产生问题,因为它们也会被塞进名称空间。主要是关于标准头。是的,我想,这个想法主要只适用于自包含api的EP。我想这会奏效,但问题不在我这边,而是我有一个巨大的库,我需要编译它,就好像它的所有符号都属于一个名称空间一样。准备好后,我会做一些类似于你所说的包含标题的事情。请参阅我对@Stowelly答案的评论。嗯,也许我的解释不清楚,但它不是“文件”,而是整个库。问题不在我的插件方面,我实际上需要编译该库,以便在所有符号中包含名称空间。谢谢,我们肯定会将名称空间补丁推向上游,但我看不到它会在几天内被接受。与此同时,我正在寻找一个暂时的解决办法;如果库足够大,正如我所说,你可以制作一个GCC插件或GCC的MELT扩展。然而,这是一个多星期的工作。是的,对不起,我应该提到那些指针看起来真的很有用。我将研究gcc插件,它们在这个特定的案例中肯定有很多工作,但我可以看到它在我们的其他项目中是有用的。