有没有一种方法可以在编译时添加命名空间?

3
我需要为一个应用程序编写插件,该应用程序静态包含了一个特定的C++库,该库不使用命名空间
不幸的是,我的插件需要链接到同一库的自定义版本。
理想情况下,我希望重新编译它,使其符号与应用程序中找到的符号不冲突。
一种方法是在编译时为库添加命名空间前缀,而不必编辑数百个文件,也不会失去从上游应用新更新的能力。
然而,显然没有适用于此的g++选项。有没有其他的方法可以以编程方式更改已经编译的.so文件中的符号?

编辑: 为了澄清,问题不在库-插件边界上,那是“容易”的部分;问题是我有这个巨大的库,我希望找到一种方法,让它重新编译,仿佛所有都属于某个命名空间,而不必更改源代码。

4个回答

1

我没有看到一个简单的解决方案。你可以编写一个GCC 插件或在GCC MELT中编写一个扩展来完成这项工作,但这可能需要太多的工作。

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


谢谢,我们一定会将命名空间的补丁推到上游,但我看不出它会在几天内被接受。同时,我正在寻找一个临时解决方案;即使是一个 hackish 的解决方案也可以。 - UncleZeiv
如果库足够大,你可以像我说的那样,制作一个GCC插件或者MELT扩展到GCC中。然而,这需要一周以上的工作时间。 - Basile Starynkevitch
抱歉,我应该提到这些指针看起来非常有用。我会研究gcc插件,虽然对于这种特定情况来说需要很多工作,但我可以看到它在我们的其他项目中也可能有用。 - UncleZeiv

1
为什么不编写一个打开命名空间并包含您已经拥有的文件的文件呢?

请查看我在 @Stowelly 的回答中的评论。 - Xeo
嗯,也许我的解释不够清晰,但它并不是“一个文件”,而是整个库。问题不在于我的插件方面,我实际上需要编译该库以便在所有符号中包含命名空间。 - UncleZeiv

0

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

namespace MY_NAMESPACE
{
 #include "api\api.h"
}

然后只需从新命名空间调用其函数

MY_NAMESPACE::api_function();

编辑:我可能在这里有点误解,因为我不确定这会如何影响符号。


1
"api/api.h" 包含其他头文件时,这可能会变得棘手,因为它们也将被塞入命名空间中。主要是指标准头文件。 - Xeo
是的,我想这个想法大多只适用于自包含的API。 - Stowelly
是的,我想这个方法可以行得通,但问题不在我这边,而是我有一个巨大的库,我需要将其编译,就好像所有的符号都属于一个命名空间。当准备好后,我会做类似于你所说的包含头文件的操作。 - UncleZeiv

0

如果您的意思是希望通过GCC命令行选项添加命名空间,那么像UncleZeiv在他们的答案中指出的那样,确实没有这样直接的命令行选项。

但是,如果您能够在代码库中创建一个新文件,您可以通过将命名空间代码放入该新文件中,然后使用GCC的-include选项将该文件添加到您的源代码中来实现此效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接